Bdecode คือกระบวนการ แปลงกลับข้อมูล (Decoding/Deserialization) ที่ถูกเข้ารหัสด้วยรูปแบบ Bencode (Bencoding) ให้กลับมาเป็น Data Structure ดั้งเดิม (เช่น String, Integer, List, Dictionary) ที่โปรแกรมสามารถอ่านและประมวลผลได้
Bencode เป็นรูปแบบการจัดเก็บและเข้ารหัสข้อมูลหลักของโปรโตคอล BitTorrent (คล้ายกับ JSON หรือ XML แต่เรียบง่ายกว่าและรองรับ Binary Data ได้ดี) ข้อมูลที่ต้องผ่านกระบวนการ Bdecode ได้แก่
- ไฟล์
.torrent: แกะอ่าน Metadata ภายใน เช่นannounce(URL ของ Tracker),piece length, รายชื่อไฟล์, ขนาดไฟล์ และค่า Hash ชิ้นส่วน - Tracker Responses: ถอดรหัสข้อมูลที่ Tracker ส่งกลับมา เช่น รายการ IP ของ Peers, จำนวน Seeders/Leechers
- DHT Messages: ถอดรหัสแพ็กเก็ตที่คุยกันในระบบ Distributed Hash Table (Kademlia)
ชนิดข้อมูลและรูปแบบของ Bencode ที่ถูก Decode
Bencode รองรับโครงสร้างข้อมูลพื้นฐานเพียง 4 ประเภท
| Data Type | รูปแบบ Bencode | ตัวอย่างหลัง Bdecode | คำอธิบาย |
| Byte String | <ความยาว>:<ข้อความ> | 4:spam $\rightarrow$ "spam" | สตริงทั่วไปหรือ Raw Binary (เช่น SHA-1 hash) |
| Integer | i<ตัวเลข>e | i42e $\rightarrow$ 42, i-3e $\rightarrow$ -3 | จำนวนเต็ม เริ่มด้วย i ปิดท้ายด้วย e |
| List (Array) | l<สมาชิก...>e | l4:spami42ee $\rightarrow$ ["spam", 42] | รายการข้อมูล เริ่มด้วย l ปิดท้ายด้วย e |
| Dictionary (Map) | d<key><val>...e | d3:cow3:moo4:spami42ee $\rightarrow$ {"cow": "moo", "spam": 42} | Key-Value โดย Key ต้องเป็น String เรียงตามตัวอักษร |
ตัวอย่างการ Decode ด้วยภาษา Python
# ตัวอย่างการ Bdecode ด้วยไลบรารี bencode-py (หรือ bcoding / torrentool)
import bencode
# ข้อมูล Bencoded
raw_data = b"d8:announce35:http://tracker.example.com/announce13:creation datei1672531199ee"
# ทำการ Bdecode
decoded = bencode.bdecode(raw_data)
print(decoded)
# ผลลัพธ์: {'announce': 'http://tracker.example.com/announce', 'creation date': 1672531199}
ทำไม BitTorrent ถึงใช้ Bencode แทน JSON?
- Deterministic (Canonical Form): โครงสร้าง Bencode บังคับเรียง Key ใน Dictionary เสมอ ทำให้ได้ Binary Output รูปแบบเดียวแน่นอน ซึ่งจำเป็นอย่างยิ่งต่อการคำนวณ Info Hash เพื่อตรวจสอบความถูกต้องของไฟล์
- รองรับ Raw Bytes ได้สมบูรณ์: ชิ้นส่วน Hash (SHA-1 / SHA-256) เป็น Binary Data 20-32 bytes การเก็บใน Bencode ทำได้โดยตรงไม่ต้องแปลงเป็น Base64 หรือ Hex ให้เปลืองพื้นที่