首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python,如何将32位整数放入字节数组中。

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

Stack Overflow用户
提问于 2011-10-27 20:05:54
回答 5查看 27.3K关注 0票数 8

我通常在C++中执行类似的操作,但是我使用python编写了一个快速的脚本,并且遇到了一些问题。

如果我有一个二进制列表(或者任何python存储"fread“in的结果)。我可以使用缓冲区、buffer1等来访问其中的各个字节。

我需要更改字节8-11来保存一个新的32位文件大小(读:已经有一个文件大小了,我需要更新它)。在C++中,我只需获得一个指向位置的指针,并将其转换为存储整数,但对于python,我突然意识到我不知道如何执行这样的操作。

如何在特定位置更新缓冲区中的4个字节以保存python中整数的值?

编辑

我将添加更多,因为我似乎无法从解决方案中找到答案(虽然我可以看到它们在正确的轨道上)。

首先,我使用python2.4(无法升级大公司服务器)--这显然限制了我的选择。很抱歉之前没有提到这一点,我不知道它有这么少的功能。

第二,让我们把这个变得非常简单。

假设我有一个名为'myfile.binary‘的二进制文件,其中的五字节内容'4C53535353’是十六进制的--这相当于文件中只有字母"L和4xS“的ascii表示形式。

如果我这样做了:

代码语言:javascript
运行
复制
f = open('myfile.binary', 'rb')
contents = f.read(5)

内容应该(根据Sven Marnach的答案)持有一个5字节的不可变字符串。

仅使用Python2.4工具,如何将“contents”中保存的4S更改为任意整数值?也就是说,给我一行代码,可以使字节索引内容1-4包含32位整数'myint‘,值为12345678910。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-27 20:21:52

您需要的是这个功能:

代码语言:javascript
运行
复制
struct.pack_into(fmt, buffer, offset, v1, v2, ...)

它被记录在靠近顶部的http://docs.python.org/library/struct.html

示例代码:

代码语言:javascript
运行
复制
import struct
import ctypes

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

类似帖子: 转到

编辑:添加了一个Python2.4兼容示例:

代码语言:javascript
运行
复制
import struct

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

Stack Overflow用户

发布于 2011-10-27 20:09:02

请看一下结构模块。您需要pack函数。

编辑:

守则:

代码语言:javascript
运行
复制
import struct

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

输出:

代码语言:javascript
运行
复制
L╙☻ЦI

struct.pack应该可以在Python2.4中使用。

你的号码"12345678910“不能打包成4个字节,我把它缩短了一点。

票数 4
EN

Stack Overflow用户

发布于 2011-10-27 20:10:37

file.read()的结果是一个字符串,它是不可变的。根据您要完成的任务的上下文,问题有不同的解决方案。

一种是使用模块:将文件直接读取为32位整数数组。您可以修改这个数组并将其写回文件。

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7921705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档