为什么我的数据的打包长度与结构中声明的不一致?

Why doesn't the packed length of my data correspond to what was declared in the struct?

我正在为我自己的教育开发一个 bittorrent 实现,但是我在将字节打包到握手数据包中时遇到了一些麻烦。下面是 table 详细说明了我正在处理的数据的性质:

注意:握手消息的格式为<pstrlen><pstr><reserved><info_hash><peer_id>

我已经验证我所有的数据变量都具有预期的长度,但我得到的不是长度为 68 的打包结构,而是长度为 72 的结构。下面是一个测试用例:

from struct import Struct

handshake = Struct('B19sQ20s20s')

pstrlen = 19
pstr = 'BitTorrent protocol'
reserved = 0
info_hash = 'x' * 20
peer_id = 'y' * 20

pkg = handshake.pack(pstrlen, pstr, reserved, info_hash, peer_id)
print len(pkg)

我显然遗漏了一些明显的东西。给出了什么?

注意struct.calcsize('B19sQ20s20s') returns 72; struct.calcsize('<B19sQ20s20s')(如@Joran Beasley 所建议)returns 68;我假设这是一个对齐问题。我建议使用 8B 而不是 Q 来保存保留值

from struct import Struct

handshake = Struct('B19s8B20s20s')

pstrlen = 19
pstr = 'BitTorrent protocol'
info_hash = 'x' * 20
peer_id = 'y' * 20

pkg = handshake.pack(pstrlen, pstr, 0,0,0,0,0,0,0,0, info_hash, peer_id)
print len(pkg)

(这会打印出 68)