为什么不是" pack"的结果?等于手动创建的字节数组?

时间:2017-06-11 04:35:15

标签: python python-3.x

我有这个:

>>> a1 = pack('>L', 18)
>>> a1
b'\x00\x00\x00\x12'

>>> a2 = [int(0x0), int(0x0), int(0x0), int(0x12)]
>>> a2
[0, 0, 0, 18]

为什么他们不相同?

>>> a1 == a2
False

3 个答案:

答案 0 :(得分:1)

因为如果你想要平等,你必须在byte string中转换第二个变量a2a1 list of ints ,并且a2 byte string ,因此除非您转换a2,否则它们永远不会被标记:例如:

import struct
import array

a1 = struct.pack('>L', 18)
print(a1)
$b'\x00\x00\x00\x12'

a2 = [int(0x0), int(0x0), int(0x0), int(0x12)]
print(a2)
$[0, 0, 0, 18] #this is a list

print(a1 == a2)
$False

a3 = array.array('B',a2).tostring() #transform the list into byte
print(a3)
$b'\x00\x00\x00\x12' 

print(a1 == a3)
$True

答案 1 :(得分:0)

pack('>L', 18)返回一个字节对象,a2是一个列表。

答案 2 :(得分:0)

列表和字节字符串不是等效类型,即使它们相似。要将列表转换为字节字符串,可以使用以下方法,具体取决于您是否使用Python 2或3。

Python 2:

>>> ''.join(chr(c) for c in a2)
'\x00\x00\x00\x12'

Python 3:

>>> bytes(a2)
b'\x00\x00\x00\x12'