在python中,我得到了一个64位整数。该整数是通过采用几个不同的8位整数并将它们混搭为一个64位巨型整数而创建的。再次将它们分开是我的工作。
例如:
Source number: 2592701575664680400 Binary (64 bits): 0010001111111011001000000101100010101010000101101011111000000000 int 1: 00100011 (35) int 2: 11111011 (251) int 3: 00100000 (32) int 4: 01011000 (88) int 5: 10101010 (170) int 6: 00010110 (22) int 7: 10111110 (190) int 8: 00000000 (0)
所以我想做的是获取我的源代码2592701575664680373并返回一个长度为8的数组,其中数组中的每个int都是上面列出的int。
2592701575664680373
我打算使用struct,但老实说,阅读文档并不清楚我将如何实现。
struct
在Python 2.x中,struct.pack返回一个字节字符串。将其转换为整数数组很容易。
struct.pack
>>> bytestr = struct.pack('>Q', 2592701575664680400) >>> bytestr '#\xfb X\xaa\x16\xbd\xd0' >>> [ord(b) for b in bytestr] [35, 251, 32, 88, 170, 22, 189, 208]
structpython中的模块用于将python对象转换为字节字符串,通常根据C结构打包规则进行打包。struct.pack采用格式说明符(一个字符串,该字符串描述应如何布局结构的字节)和一些python数据,并将其打包为字节字符串。struct.unpack进行相反的处理,采用格式说明符和字节字符串,然后再次以python对象的格式返回未打包数据的元组。
struct.unpack
所使用的格式说明符分为两部分。前导字符指定字符串的字节序(字节顺序)。以下字符指定要打包或解压缩的结构的字段的类型。因此,'>Q'意味着将给定数据打包为big- endian unsigned long long。要以相反的顺序获取字节,可以改用<little-endian。
'>Q'
unsigned long long
<
最后的操作是列表理解,它遍历字节字符串的字符并使用ord内置函数来获取该字符的整数表示。
ord
最后说明:Python实际上没有整数大小的概念。在2.x中,int它的长度限制为32位,并且long大小不受限制。在3.x中,这两个被统一为一个类型。因此,即使此操作保证可以提供仅占用一个字节的整数,但如果您在其他操作中使用python,则注意python仍将迫使所得整数保持这种方式。
int
long