我正在通过这个规范使用 Java 实现 BitTorent 协议。在消息部分中,所有消息都是固定长度的,除了其中 2 个;对于其中一个,这是握手后唯一的可变消息,因此我可以检查其他消息,并在没有其他消息遇到时假设它是一条消息。但是对于以下消息
bitfield: <len=0001+X><id=5><bitfield>
位域消息只能在握手序列完成后立即发送,并且在发送任何其他消息之前。它是可选的,如果客户端没有片段则不需要发送。
位域消息是可变长度的,其中 X 是位域的长度。有效负载是一个位域,表示已成功下载的片段。第一个字节中的高位对应于片段索引 0。清除的位表示丢失的片段,设置的位表示有效且可用的片段。最后的备用位设置为零。
错误长度的位域被视为错误。如果客户端收到大小不正确的位域,或者位域设置了任何备用位,则客户端应断开连接。
如果我不知道长度,我无法想出解析它的方法;我应该如何在字节流中定位 id ?
编辑:在位域消息的有效负载中是 0 或 1,用于 torrent 文件中的每个片段,消息的长度将根据 torrent 内容的大小而变化。所以我不认为我可以假设件数总是适合 5 字节数。