public
Description: Tiny PHP+mySQL BitTorrent tracker
Homepage: http://soultcer.net/wiki/Code/nanotrack
Clone URL: git://github.com/soult/nanotrack.git
nanotrack / bencode.php
100644 84 lines (80 sloc) 1.826 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
 
function bencode($data) {
if(is_array($data)) {
$assoc = false;
$old_key = -1;
foreach($data as $key => $value) {
if(!is_int($key) || $key != ($old_key + 1)) {
$assoc = true;
break;
}
            $old_key = $key;
}
if($assoc) {
$string = 'd';
            ksort($data, SORT_STRING);
foreach($data as $key => $value) {
$string .= bencode($key) . bencode($value);
}
} else {
$string = 'l';
foreach($data as $value) {
$string .= bencode($value);
}
}
        $string .= 'e';
return $string;
} elseif(is_int($data)) {
return 'i' . $data . 'e';
} elseif(is_string($data)) {
return strlen($data) . ':' . $data;
}
}
 
function bdecode(&$string) {
if($string == "") {
return null;
}
if($string == null) {
die('Failed to decode' . "\n");
}
switch($string[0]) {
case 'i':
$end = strpos($string, 'e');
if($end === false) {
die('Failed to decode' . "\n");
}
$data = (int) substr($string, 1, $end - 1);
$string = (string) substr($string, $end + 1);
return $data;
case 'l':
$string = substr($string, 1);
$data = array();
while($string[0] != 'e') {
$data[] = bdecode($string);
}
$string = (string) substr($string, 1);
return $data;
case 'd':
$string = substr($string, 1);
$data = array();
while($string[0] != 'e') {
$data[bdecode($string)] = bdecode($string);
}
$string = (string) substr($string, 1);
return $data;
default:
$end = strpos($string, ':') + 1;
if($end == 0) {
die('Failed to decode' . "\n");
}
$length = (int) substr($string, 0, $end);
$string = substr($string, $end);
if($length > strlen($string)) {
die('Failed to decode' . "\n");
}
$data = substr($string, 0, $length);
$string = (string)substr($string, $length);
return $data;
}
}
 
?>