목차
토렌트 파일 포맷 조사
거두절미하고 토렌트 파일 포맷에 대해 소개합니다.
Bencode
토렌트 파일 포맷의 근간은 Bencode(B encode)입니다. 형식은 바이너리 파일이지만 자유롭게 확장이 가능한, 유연한 구조를 가지고 있습니다.
Bencode Data Type
Bencode는 네가지 데이터 타입을 지원합니다.
- 바이트 스트링 (byte string)
- 정수 (integer)
- 리스트 (list)
- 사전 (dictionary)
바이트 스트링 (byte string)
바이트 스트링은 바이트의 나열입니다. 기본적으로 ASCII 코드로 가정하며, 인코딩에 대해서는 신경쓰지 않습니다. '<길이>:<문자열>' 식으로 표현합니다. 그러므로 'apple'을 bencode하면 '5:apple'이 되겠네요. 문자열 끝은 널(null) 문자가 아닙니다. 문자열의 길이는 10진법으로 표시하며 0이 될 수 있습니다. 문자열의 길이를 나타내는 숫자 또한 단순한 아스키 문자입니다.
정수 (integer)
정수는 처음에 'i'라는 문자열이 나옵니다. 그리고 'e'로 마칩니다. i, e 사이에는 0~9사이의 아스키 문자가 나옵니다. 이 아스키 문자가 정수입니다. 0은 허용하지만 0이 아닌 수에 처음으로 나오는 0은 허용하지 않습니다. 음수는 '-' 기호를 붙여 표기하면 됩니다. -0도 안 됩니다. 그러므로 정수 56과 -32를 각각 Bencode하면 'i56e', 'i-32e'가 되겠네요.
리스트 (list)
리스트는 'l'과 'e' 사이에 데이터를 적어주기만 하면 됩니다. 리스트 ['a', 'bar', 78]은 'l1:a3:bari78ee'로 인코딩되는군요.
사전 (dictionary)
딕셔너리는 'd'와 'e' 사이에 키와 값을 적으면 됩니다. 키는 반드시 사전순서야만 하고 키 다음에 바로 해당 키의 값이 나와야 합니다. (키, 값) 쌍의 목록인 (apple, fruit), (lion, animal), (cat, 12)를 Bencode해 보겠습니다. 각 키 값을 따로따로 Bencode하면
- 5:apple 5:fruit
- 4:lion 6:animal
- 3:cat i12e
키를 사전 순으로 정렬한 후 모두 합치면 'd5:apple5fruit3:cati12e4:lion6:animale'이 됩니다.