Bencode
Bencode(發音為Bee-Encode)是BitTorrent用在傳輸資料結構的編碼方式。這種編碼方式支援四種資料型態:
Bencode最常被用在.torrent檔中,檔案裏的元數據都是被Bencode編碼過的字典表。這種編碼方法也被Tracker返迴響應時使用。
雖然比用純二進制編碼效率低,但Bencode結構簡單而且不受位元組儲存順序影響(所有數字以十進制編碼),這對於跨平台性非常重要。並且,Bencode具有較好的靈活性,即使存在故障的字典鍵,只要將其忽略並更換新的就能相容補充。
編碼方法
Bencode使用ASCII字元進行編碼。
- 一個整型數會以十進制數編碼並括在i和e之間,不允許前導零(但0依然為整數0),負數如十進制表示一樣使用前導負號,不允許負零。如整型數「42」編碼為「
i42e
」,數字「0」編碼為「i0e
」,「-42」編碼為「i-42e
」。 - 一個以位元組為單位表示的字串(字串的字為一個位元組,不一定是一個字元)會以
(长度):(内容)
編碼,長度的值和數字編碼方法一樣,只是不允許負數;內容就是字串的內容,如字串「spam」就會編碼為「4:spam
」,本規則不能處理ASCII以外的字串,為了解決這個問題,一些BitTorrent程式會以非標準的方式將ASCII以外的字元以UTF-8編碼轉化後再編碼。 - 線性表會以l和e括住來編碼,其中的內容為Bencode四種編碼格式所組成的編碼字串,如包含和字串「spam」數字「42」的線性表會被編碼為「
l4:spami42ee
」,注意分隔符要對應配對。 - 字典表會以d和e括住來編碼,字典元素的鍵和值必須緊跟在一起,而且所有鍵為字串類型並按字典順序排好。如鍵為「bar」值為字串「spam」和鍵為「foo」值為整數「42」的字典表會被編碼為「
d3:bar4:spam3:fooi42ee
」。
對於線性表和字典的取值範圍並沒有限制,它們通常會包含其他元素,這樣就允許對很複雜的數據結構進行編碼。
外部連結
- Another BitTorrent protocol specification(頁面存檔備份,存於互聯網檔案館)
- File_Bittorrent2(頁面存檔備份,存於互聯網檔案館) - Another PHP Bencode/decode implementation
- The original BitTorrent implementation in Python as standalone package(頁面存檔備份,存於互聯網檔案館)
- BEncode Editor
- bencode-tools(頁面存檔備份,存於互聯網檔案館) - a C library for manipulating bencoded data and a XML schema like validator for bencode messages in Python
- Bencode parsing in Java
- Bencode parsing in C