了解 BitTorrent 片段输出

Posted

技术标签:

【中文标题】了解 BitTorrent 片段输出【英文标题】:Understanding BitTorrent Pieces Output 【发布时间】:2017-02-14 19:39:22 【问题描述】:

使用https://github.com/utdemir/bencoder 从单个文件洪流中提取元信息后,我在输出的“片段”部分下看到以下文本-

This is an abbreviated portion of the output- 'pieces':'\x8f1g\xdb\x1e\x17\n(\xf9\xbb\xb0&\xa0\xadT9N\xa8L\x89\x97\xf79\x15\x07N

在查看https://wiki.theory.org/BitTorrentSpecification之后,我了解到这个输出是-

[a] 字符串,由所有 20 字节 SHA1 哈希值的串联组成,每段一个(字节字符串,即未进行 urlencoded)

但是我看到恒定的反斜杠“\”并且想知道这是否类似于十六进制代码,因为 SHA-1 通常输出为十六进制?

【问题讨论】:

是的,当 ascii 不可用时,字节表示为十六进制 是的,这些是十六进制表示的字节。尝试将 '\x68\x65\x6c\x6c\x6f' 放入 Python shell(如果您使用的是 Python3,则尝试将 b'\x68\x65\x6c\x6c\x6f' )。 @kirbuchi 如果字母“g”包含在这些表示中,则不会超出十六进制范围,因为十六进制在字母表示中以“f”结尾 @CJCahala 您可以在 Python 字节串(例如 b'\x68ello')中混合 ascii 字母和十六进制表示,\ 转义接下来的两个字符并将它们视为下一个字节的十六进制表示。 “SHA-1 通常输出为十六进制” 一个十六进制 sha1 输出有多少个字符?规范说每个哈希有多少字节? 【参考方案1】:

您从程序中看到的输出被编码为Python bytesliteral, 是不可打印的字节,ASCII 被转义。

\x8f1g\xdb\x1e\x17\n(\xf9\xbb\xb0&\xa0\xadT9N\xa8L\x89\x97\xf79\x15\x07N

\x8f => 十六进制 0x8F1g => ASCII "1g"\xdb\x1e\x17 => 十六进制 0xDB1E17\n => 转义序列表示 ASCII 换行 (LF)(十六进制0x0A)( => ASCII "("\xf9\xbb\xb0 => 十六进制 0xF9BBB0 等等

【讨论】:

以上是关于了解 BitTorrent 片段输出的主要内容,如果未能解决你的问题,请参考以下文章

洪流 DHT udp

未知的 Bittorrent 消息

BitTorrent 顺序片下载

为啥我从对等端接收的数据与预期输出不匹配?

迅雷是如何通过磁力链接获取资源的?

在像 bittorrent 这样的点对点协议的情况下,NAT 遍历是如何工作的。