<?php
/* lightbenc.php
Dear Bram Cohen,
You are an arse
WHAT were you smoking ?
This implementation should use one order of magnitude less memory then the TBdev version.
The bdecoding speed is similar to TBdev, bencoding is faster, and much faster then bdecoding.
Call the bdecode() function with the bencoded string:
$str="d7:oneListl8:a stringe10:oneIntegeri34ee";
var_dump(bdecode($str));
array(3) {
["oneList"]=>
array(1) {
[0]=>
string(8) "a string"
}
["oneInteger"]=>
int(34)
["isDct"]=>
bool(true)
}
The returned value is a nested data type with the following type of elements:
- ints (test type with is_integer($x))
- strings (test type with is_string($x))
- lists (test type with is_array($x) && !isset($x[isDct])
- dicts (test type with is_array($x) && isset($x[isDct])
All elements have the native PHP type, except for the dictionary which is an array with an "isDct" key.
This is necessary since PHP makes no distinction between flat and associative arrays. Note that the isDct
key is allways set as a bool, so that even if the dictionary contains an actual "isDct" value, the
functions behave transparently, i.e. they don't strip out or overwrite actual "isDct" keys.
As such, this implementation is not a drop-in replacement of the TBDev code, hence the new function names
For all practical purposes, it's just as flexible, and very easy to use. For example:
// decode the torrent file
$dict= bdecode_file($torrentfilename);
// change announce url
$dict['announce']='http://inferno.demonoid.com';
// add private tracker flag
$dict['info']['private']=1;
// compute infohash
$infohash = pack("H*", sha1(bencode($dict["info"])));
// recreate the torrent file
$torrentfile=bencode($dict);
After calling bencode(), the passed nested array will have all it's dictionaries sorted by key.
The bencoded data generated by bencode() will have sorted dictionaries, but bdecode() does not require
this in the input stream, and will keep the order unchanged.
This implementation is hereby released under the GFYPL, version 1.00.
The Go Fuck Yourself Public License, version 1.00
Article 1
You can go fuck yourself.
END OF ALL TERMS AND CONDITIONS
*/
class Lightbenc{
public static function bdecode($s, &$pos=0) {
if($pos>=strlen($s)) {
return null;
}
switch($s[$pos]){
case 'd':
$pos++;
$retval=array();
while ($s[$pos]!='e'){
$key=Lightbenc::bdecode($s, $pos);
$val=Lightbenc::bdecode($s, $pos);
if ($key===null || $val===null)
break;
$retval[$key]=$val;
}
$retval["isDct"]=true;
$pos++;
return $retval;
case 'l':
$pos++;
$retval=array();
while ($s[$pos]!='e'){
$val=Lightbenc::bdecode($s, $pos);
if ($val===null)
break;
$retval[]=$val;
}
$pos++;
return $retval;
case 'i':
$pos++;
$digits=strpos($s, 'e', $pos)-$pos;
$val=(int)substr($s, $pos, $digits);
$pos+=$digits+1;
return $val;
// case "0": case "1": case "2": case "3": case "4":
// case "5": case "6": case "7": case "8": case "9":
default:
$digits=strpos($s, ':', $pos)-$pos;
if ($digits<0 || $digits >20)
return null;
$len=(int)substr($s, $pos, $digits);
$pos+=$digits+1;
$str=substr($s, $pos, $len);
$pos+=$len;
//echo "pos: $pos str: [$str] len: $len digits: $digits\n";
return (string)$str;
}
return null;
}
public static function bencode(&$d){
if(is_array($d)){
$ret="l";
if(isset($d["isDct"])&&$d["isDct"]){
$isDict=1;
$ret="d";
// this is required by the specs, and BitTornado actualy chokes on unsorted dictionaries
ksort($d, SORT_STRING);
}
foreach($d as $key=>$value) {
if(isset($isDict)&&$isDict){
// skip the isDct element, only if it's set by us
if($key=="isDct" and is_bool($value)) continue;
$ret.=strlen($key).":".$key;
}
if (is_string($value)) {
$ret.=strlen($value).":".$value;
} elseif (is_int($value)){
$ret.="i${value}e";
} else {
$ret.=Lightbenc::bencode ($value);
}
}
return $ret."e";
} elseif (is_string($d)) // fallback if we're given a single bencoded string or int
return strlen($d).":".$d;
elseif (is_int($d))
return "i${d}e";
else
return null;
}
public static function bdecode_file($filename){
$f=file_get_contents($filename, FILE_BINARY);
return Lightbenc::bdecode($f);
}
public static function bdecode_getinfo($filename){
$t = Lightbenc::bdecode(file_get_contents($filename, FILE_BINARY));
$t['info_hash'] = sha1(Lightbenc::bencode($t['info']));
if(is_array($t['info']['files'])){ //multifile
$t['info']['size'] = 0;
$t['info']['filecount'] = 0;
foreach($t['info']['files'] as $file){
$t['info']['filecount']++;
$t['info']['size']+=$file['length'];
}
}else{
$t['info']['size'] = $t['info']['length'];
$t['info']["filecount"] = 1;
$t['info']['files'][0]['path'] = $t['info']['name'];
$t['info']['files'][0]['length'] = $t['info']['length'];
}
return $t;
}
}
?>

sticklee
- 粉丝: 6
最新资源
- 科技平台如何借助AI+数智应用解决资源丰富度和可持续发展问题?.docx
- 科技平台如何借助AI+数智应用解决资源匮乏与服务低效的问题?.docx
- 科技平台如何借助AI+数智应用实现可持续发展,避免陷入“资源有余而活力不足”的困境?.docx
- 科技平台如何利用AI+数智应用工具提升服务价值和市场竞争力?.docx
- 科技平台如何通过AI+数智应用解决资源整合难题?.docx
- 科技平台运营模式创新有哪些AI+数智应用关键要素?.docx
- 科技市场化过程中,如何通过AI+数智应用有效整合资源以提升平台竞争力?.docx
- 科技市场化中,如何通过AI+数智应用应对技术转移过程中的挑战?.docx
- 科技项目创新管理中如何通过AI+数智应用高效整合多维度资源,解决平台资源匮乏问题?.docx
- 科技资源管理平台的三大核心问题是什么?如何通过AI+数智应用工具有效解决?.docx
- 科技资源管理平台如何通过AI+数智应用实现可持续发展?.docx
- 面对复杂的技术转移服务需求,如何通过AI+数智应用构建更智能高效的服务体系?.docx
- 面对技术引进合作分析的需求,AI+数智应用科技创新平台应如何高效应对?.docx
- 面对科技服务平台服务效能不足的问题,如何借助AI+数智应用科技创新助力提升服务专业性和效率?.docx
- 企业科技创新服务平台如何通过AI+数智应用保障服务质量与专业性?.docx
- 企业科技创新服务平台如何借助AI+数智应用解决科技资源匮乏与信息不对称问题?.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


