一尘不染

在python中将64位整数转换为8个单独的1字节整数

python

在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。

我打算使用struct,但老实说,阅读文档并不清楚我将如何实现。


阅读 476

收藏
2021-01-20

共1个答案

一尘不染

在Python 2.x中,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对象的格式返回未打包数据的元组。

所使用的格式说明符分为两部分。前导字符指定字符串的字节序(字节顺序)。以下字符指定要打包或解压缩的结构的字段的类型。因此,'>Q'意味着将给定数据打包为big-
endian unsigned long long。要以相反的顺序获取字节,可以改用<little-endian。

最后的操作是列表理解,它遍历字节字符串的字符并使用ord内置函数来获取该字符的整数表示。

最后说明:Python实际上没有整数大小的概念。在2.x中,int它的长度限制为32位,并且long大小不受限制。在3.x中,这两个被统一为一个类型。因此,即使此操作保证可以提供仅占用一个字节的整数,但如果您在其他操作中使用python,则注意python仍将迫使所得整数保持这种方式。

2021-01-20