2014-12-01 201 views
1

如何在Python 3中以二进制形式将整数写入文件中?例如,我想将6277101735386680763835789423176059013767194773182842284081写入一个二进制文件,正好有24个字节(无符号,我只能使用正整数)。我怎样才能做到这一点?我试过如下:在Python中以二进制形式写入整数文件

struct.pack("i", 6277101735386680763835789423176059013767194773182842284081) 

这导致

ValueError: cannot fit 'int' into an index-sized integer 

我已经尝试了一些其他格式( “L”, “Q”)相同,但这些也导致错误:

struct.error: argument out of range 

如果我可以将整数转换为正好24个字节,我就可以写入文件,因为我知道该怎么做。但是,我似乎无法将整数转换为字节。

此外,如何确保每个整数写入正好24个字节?我也会写较小的数字(1000,2000,1598754,12),但是这些也应该占用24个字节。

然后我怎样才能从文件中读取整数?

+0

http://code.activestate.com/recipes/576617-converting-arbitrary-size-python-整数到分组/ – 2014-12-01 22:43:03

回答

1

您可以

x = value & 0xFF 

提取至少显著字节,可以从数以

value = value >> 8 

重复此过程24次会给你个字节删除字节。

您还可以通过取出更多的字节,例如与

x = value & 0xFFFFFFFF 
value = value >> 32 

你一次处理4个字节加快这一进程。

+0

可能希望使'chr(值&0xFF)',但我删除了我的答案赞成这个答案(和+1)你(因为我错了......我没有真正阅读问题右) – 2014-12-01 22:46:39

2

使用Python 3,你可以做到以下几点:

i = 6277101735386680763835789423176059013767194773182842284081 
with open('out.bin', 'wb') as file: 
    file.write((i).to_bytes(24, byteorder='big', signed=False)) 

with open('out.bin', 'rb') as file: 
    j = int.from_bytes(file.read(), byteorder='big') 

print(j) 

输出:

$ python3 tiny.py 
6277101735386680763835789423176059013767194773182842284081 
+0

为什么你不需要指出应该从文件中读取24个字节?字节顺序=“大”是否已经表明这一点? – Dasherman 2014-12-01 23:00:53

+0

不,读部分没有限制。文件内容将被转换为数字。如果你只想读取前24个字节,用'file.read()[:24]'替换'file.read()'。 'byteorder ='big''是一个关于如何存储数字的约定http://en.wikipedia.org/wiki/Endianness – 2014-12-01 23:04:23

+0

我看,file.read(24)也可以,对吗? – Dasherman 2014-12-01 23:06:14