import struct
port = 1331
fragments = [1,2,3,4]
flags = bytes([64])
name = "Hello World"
data = struct.pack('HcHH', port, flags, len(fragments), len(name))
print(int.from_bytes(data[3:5], byteorder='big'))
print(int.from_bytes(data[5:7], byteorder='big'))
print(int.from_bytes(data[0:2], byteorder='little'))
当我像这样打印它们时,它们会正确地出来。似乎port以小尾数表示,而
len(fragments)
和len(name)
用大尾数表示。如果我还在端口上进行大端字节排序,则它将得到错误的值。那么为什么struct这样表现呢?还是我错过了什么?
最佳答案
由于“ H”中间的“ c”,发生了一些有趣的对齐。您可以使用calcsize看到它:
>>> struct.calcsize('HcHH')
8
>>> struct.calcsize('HHHc')
7
因此,您的数据与您想像的不一致。正确的拆包是:
print(int.from_bytes(data[4:6], byteorder='little'))
# 4
print(int.from_bytes(data[6:], byteorder='little'))
# 11
事实证明,偶然地,'c'的添加字节为'\ x00',并使您的字节链在big-endian中正确无误:
>>> data
b'3\x05@\x00\x04\x00\x0b\x00'
^^^^
this is the intruder
关于python - 为什么struct中的第一个打包数据是little endian,而其余的是big endian?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58439864/