繁体   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