簡體   English   中英

Python,如何將32位整數放入字節數組中

[英]Python, how to put 32-bit integer into byte array

我通常在C ++中執行這樣的操作,但我正在使用python編寫一個快速腳本而且我遇到了問題。

如果我有一個二進制列表(或任何python存儲“fread”的結果)。 我可以使用:buffer [0],buffer [1]等訪問其中的各個字節。

我需要更改字節[8-11]以保存新的32位文件大小(讀取:那里已有文件大小,我需要更新它)。 在C ++中,我只是得到一個指向該位置的指針並將其轉換為存儲整數,但是使用python我突然意識到我不知道如何做這樣的事情。

如何在特定位置更新緩沖區中的4個字節以保存python中的整數值?

編輯

我將添加更多,因為我似乎無法從解決方案中找到它(雖然我可以看到它們在正確的軌道上)。

首先,我在python 2.4(並且無法升級,大公司服務器) - 所以這顯然限制了我的選擇。 很抱歉沒有提及,我不知道它有這么多的功能。

其次,讓我們做到這一點非常簡單。

假設我有一個名為'myfile.binary'的二進制文件,其中包含十六進制的五字節內容'4C53535353' - 這相當於文件中單獨的字母“L和4xS”的ascii表示。

如果我做:

f = open('myfile.binary', 'rb')
contents = f.read(5)

內容應該(來自Sven Marnach的答案)保存一個五字節的不可變字符串。

僅使用Python 2.4工具,如何將'contents'中的4 S更改為任意整數值? 即給我一行代碼,可以使字節索引內容[1-4]包含值為12345678910的32位整數'myint'。

你需要的是這個功能:

struct.pack_into(fmt, buffer, offset, v1, v2, ...)

它位於頂部附近的http://docs.python.org/library/struct.html上。

示例代碼:

import struct
import ctypes

data=ctypes.create_string_buffer(10)
struct.pack_into(">i", data, 5, 0x12345678)
print list(data)

類似的帖子: Python:如何使用struct.pack_into將不同類型的數據打包到字符串緩沖區中

編輯:添加了Python 2.4兼容的示例:

import struct

f=open('myfile.binary', 'rb')
contents=f.read(5)
data=list(contents)
data[0:4]=struct.pack(">i", 0x12345678)
print data

看看Struct模塊。 你需要pack功能。

編輯:

編碼:

import struct

s = "LSSSS" # your string
s = s[0] + struct.pack('<I', 1234567891) # note "shorter" constant than in your example
print s

輸出:

L╙☻ЦI

struct.pack應該在Python2.4中可用。

您的號碼“12345678910”無法打包成4個字節,我將其縮短了一點。

file.read()的結果是Python中的一個字符串,它是不可變的。 根據您要完成的任務的上下文,可以使用不同的解決方案。

一種是使用array模塊 :直接讀取文件為32位整數數組。 您可以修改此數組並將其寫回文件。

with open("filename") as f:
    f.seek(0, 2)
    size = f.tell()
    f.seek(0)
    data = array.array("i")
    assert data.itemsize == 4
    data.fromfile(f, size // 4)
data[2] = new_value
# use data.tofile(g) to write the data back to a new file g

您可以安裝numpy模塊,該模塊通常用於科學計算。

read_data = numpy.fromfile(file = id,dtype = numpy.uint32)

然后訪問所需位置的數據並進行更改。

以下只是一個演示,讓您了解將四個字節轉換為整數時實際發生的情況。 假設你有一個數字:15213

Decimal: 15213
Binary: 0011 1011 0110 1101
Hex: 3 B 6 D

在little-endian系統(即x86機器)上,這個數字可以使用長度為4字節的數據表示為: b"\\x6d\\x3b\\x00\\x00"b"m;\\x00\\x00"當你打印它時在屏幕上,要將四個字節轉換為整數,我們只需進行一些基本轉換,在這種情況下,它是:

sum(n*(256**i) for i,n in enumerate(b"\x6d\x3b\x00\x00"))

這給你的結果:15213

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM