我通常在C++中执行类似的操作,但是我使用python编写了一个快速的脚本,并且遇到了一些问题。
如果我有一个二进制列表(或者任何python存储"fread“in的结果)。我可以使用缓冲区、buffer1等来访问其中的各个字节。
我需要更改字节8-11来保存一个新的32位文件大小(读:已经有一个文件大小了,我需要更新它)。在C++中,我只需获得一个指向位置的指针,并将其转换为存储整数,但对于python,我突然意识到我不知道如何执行这样的操作。
如何在特定位置更新缓冲区中的4个字节以保存python中整数的值?
编辑
我将添加更多,因为我似乎无法从解决方案中找到答案(虽然我可以看到它们在正确的轨道上)。
首先,我使用python2.4(无法升级大公司服务器)--这显然限制了我的选择。很抱歉之前没有提到这一点,我不知道它有这么少的功能。
第二,让我们把这个变得非常简单。
假设我有一个名为'myfile.binary‘的二进制文件,其中的五字节内容'4C53535353’是十六进制的--这相当于文件中只有字母"L和4xS“的ascii表示形式。
如果我这样做了:
f = open('myfile.binary', 'rb')
contents = f.read(5)
内容应该(根据Sven Marnach的答案)持有一个5字节的不可变字符串。
仅使用Python2.4工具,如何将“contents”中保存的4S更改为任意整数值?也就是说,给我一行代码,可以使字节索引内容1-4包含32位整数'myint‘,值为12345678910。
发布于 2011-10-27 20:21:52
您需要的是这个功能:
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)
类似帖子: 转到
编辑:添加了一个Python2.4兼容示例:
import struct
f=open('myfile.binary', 'rb')
contents=f.read(5)
data=list(contents)
data[0:4]=struct.pack(">i", 0x12345678)
print data
发布于 2011-10-27 20:09:02
请看一下结构模块。您需要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个字节,我把它缩短了一点。
发布于 2011-10-27 20:10:37
file.read()
的结果是一个字符串,它是不可变的。根据您要完成的任务的上下文,问题有不同的解决方案。
一种是使用模块:将文件直接读取为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
https://stackoverflow.com/questions/7921705
复制相似问题