我正在为自己的启发工作一个bittorrent实现,但我在将数据打包到握手数据包时遇到了一些麻烦。下面的表格详细说明了我使用的数据的性质:
注意:握手信息在<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)
我明显遗漏了一些明显的东西。是什么给了什么?
答案 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)