为什么我的数据的打包长度不对应于结构中声明的内容?

时间:2015-01-13 20:47:08

标签: python struct bittorrent

我正在为自己的启发工作一个bittorrent实现,但我在将数据打包到握手数据包时遇到了一些麻烦。下面的表格详细说明了我使用的数据的性质:

注意:握手信息在<pstrlen><pstr><reserved><info_hash><peer_id>

表格后面

Handshake message follows the form <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)

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

1 个答案:

答案 0 :(得分:3)

注意struct.calcsize('B19sQ20s20s')返回72; struct.calcsize('<B19sQ20s20s')(由@Joran Beasley建议)返回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)