在Python中,长整数具有无限的精度。我想写入一个16字节(128位)的整数到一个文件中。标准库中的struct
仅支持最多8个字节的整数。array
也有同样的限制。有没有办法在不屏蔽和移位每个整数的情况下做到这一点?
这里需要说明的是:我正在写入一个文件,该文件将从非Python程序中读入,因此pickle被删除。所有128位都被使用了。
发布于 2011-01-12 23:59:34
我认为对于无符号整数(忽略字节顺序),类似于
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的输出、不使用显式掩码以及(我假设)不使用任何非标准模块的要求。不过,并不是特别优雅。
发布于 2011-01-13 00:17:52
对于简单而灵活的解决方案,PyPi bitarray模块和内置的bin()
函数似乎是一个很好的组合。
bytes = bitarray(bin(my_long)[2:]).tobytes()
可以通过多几行代码来控制字节顺序。你必须评估它的效率。
发布于 2011-01-12 23:25:33
这可能无法避免“掩码和移位每个整数”的要求。我不确定在Python长值的上下文中避免掩码和移位意味着什么。
字节数如下:
def bytes( long_int ):
bytes = []
while long_int != 0:
b = long_int%256
bytes.insert( 0, b )
long_int //= 256
return bytes
然后,您可以使用struct.pack( '16b', bytes )
打包此字节列表
https://stackoverflow.com/questions/4670350
复制相似问题