如何在Python中将长整型写为二进制?

8 投票
9 回答
19293 浏览
提问于 2025-04-16 09:50

在Python中,长整型的数字可以非常大,没有限制。我想把一个16字节(128位)的整数写入一个文件。标准库里的struct只支持到8字节的整数,而array也有同样的限制。有没有办法可以做到这一点,而不需要对每个整数进行掩码和位移操作呢?

这里再补充一下:我写入的文件是要被非Python程序读取的,所以不能用pickle。所有的128位都要用上。

9 个回答

3

PyPi bitarray模块和内置的bin()函数结合起来,听起来是一个简单又灵活的解决方案。

bytes = bitarray(bin(my_long)[2:]).tobytes()

你可以通过多写几行代码来控制字节序。你需要自己评估一下效率如何。

9

我觉得对于无符号整数(不考虑字节序),像下面这样的代码

import binascii

def binify(x):
    h = hex(x)[2:].rstrip('L')
    return binascii.unhexlify('0'*(32-len(h))+h)

>>> for i in 0, 1, 2**128-1:
...     print i, repr(binify(i))
... 
0 '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
1 '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
340282366920938463463374607431768211455 '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'

在技术上可能满足不使用Python特定输出、不使用显式掩码,并且(我假设)不使用任何非标准模块的要求。不过,这样写并不是特别优雅。

5

这里有两种可能的解决方案:

  1. 你可以直接使用pickle来处理你的大整数。这种方法会把整数以一种特殊的格式保存下来,以后可以再读取,如果你只想这样做的话。

  2. 你也可以使用这个答案中的第二段代码,把大整数转换成大端字符串(如果你喜欢小端格式,也可以很容易地转换),然后把这个字符串写入你的文件。

问题在于,大整数的内部表示并不直接包含你想要的二进制数据。

撰写回答