我通常在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'。
答案 0 :(得分:10)
您需要的是此功能:
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: How to pack different types of data into a string buffer using 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
答案 1 :(得分:4)
查看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个字节,我稍微缩短了一点。
答案 2 :(得分:2)
file.read()
的结果是Python中的一个字符串,它是不可变的。根据您尝试完成的任务的上下文,可以使用不同的解决方案。
一个是使用array
module:直接读取文件作为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
答案 3 :(得分:2)
您可以安装numpy模块,该模块通常用于科学计算。
read_data = numpy.fromfile(file = id,dtype = numpy.uint32)
然后访问所需位置的数据并进行更改。
答案 4 :(得分:1)
以下只是一个演示,让您了解将四个字节转换为整数时会发生什么。 假设你有一个数字: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"
,以转换为4将字节转换为整数,我们只需进行一些基本转换,在本例中为:
sum(n*(256**i) for i,n in enumerate(b"\x6d\x3b\x00\x00"))
这会给你结果:15213