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/

10-12 04:27