Python,如何将32位整数放入字节数组中

时间:2011-10-27 20:05:54

标签: python

我通常在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'。

5 个答案:

答案 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