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

Jim*_*ker 8 python struct biginteger

在Python中,长整数具有无限精度.我想写一个16字节(128位)整数到一个文件.struct标准库中只支持最多8个字节的整数.array有同样的限制.有没有办法在没有屏蔽和移动每个整数的情况下执行此操作?

这里有一些澄清:我正在写一个将从非Python程序中读取的文件,因此pickle已经出来了.全部使用128位.

DSM*_*DSM 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'
Run Code Online (Sandbox Code Playgroud)

可能在技术上满足具有非Python特定输出的要求,而不是使用显式掩码,并且(我假设)不使用任何非标准模块.但不是特别优雅.

  • @Score_Under:第一句话说"对于无符号整数". (4认同)

Sve*_*ach 5

两种可能的解决方

  1. 只需腌制你的长整数.这将以特殊格式写入整数,允许再次读取它,如果这是您想要的全部.

  2. 使用此答案中的第二个代码片段将long int转换为大端字符串(如果您愿意,可以将其轻松更改为小端),并将此字符串写入您的文件.

问题是bigints的内部表示不直接包含您要求的二进制数据.