Decoding#
Changed in version 2.0: options array is replaced with named parameters
Note
Parameter order is not guaranteed for options, use named parameters
Scalars#
Scalars will be converted to their respective types:
<?php
use Arokettu\Bencode\Bencode;
$data = Bencode::decode(
"d" .
"3:arrli1ei2ei3ei4ee" .
"4:booli1e" .
"3:inti123e" .
"6:string9:test\0test" .
"e"
);
// [
// "arr" => [1,2,3,4],
// "bool" => 1,
// "int" => 123,
// "string" => "test\0test",
// ]
Please note that booleans will stay converted because Bencode has no native support for these types.
Lists and Dictionaries#
Changed in version 3.0: Collection
is now a real enum
Changed in version 4.0: Passing class names as handlers was removed
Dictionaries and lists will be arrays by default.
You can change this behavior with options.
Use Collection
enum for built in behaviors:
<?php
use Arokettu\Bencode\Bencode;
$data = Bencode::decode(
"...",
// convert to a basic PHP array
// this is a default for listType
listType: Bencode\Collection::ARRAY,
// convert to ArrayObject
// this is a default for dictType
dictType: Bencode\Collection::ARRAY_OBJECT,
// convert to stdClass
// dictType: Bencode\Collection::STDCLASS,
);
Or use advanced control with callbacks:
<?php
use Arokettu\Bencode\Bencode;
$data = Bencode::decode(
"...",
// use callback for greater flexibility
listType: function (iterable $list) {
return new ArrayObject(
[...$list],
ArrayObject::ARRAY_AS_PROPS
);
},
);
Big Integers#
By default the library only works with a native integer type but if you need to use large integers, for example, if you want to parse a torrent file for a >= 4GB file on a 32 bit system, you can enable big integer support.
External Libraries#
Added in version 1.5/2.5: GMP support
Added in version 1.6/2.6: Pear’s Math_BigInteger, brick/math
Changed in version 3.0: BigInt
is now a real enum
Added in version 4.3: BCMath support
Important
These math libraries are not explicit dependencies of this library. Install them separately before enabling.
Supported libraries:
BCMath (PHP 8.4+)
PEAR’s Math_BigInteger
<?php
use Arokettu\Bencode\Bencode;
// GMP
$data = Bencode::decode(
"d3:inti79228162514264337593543950336ee",
bigInt: Bencode\BigInt::GMP,
);
// ['int' => gmp_init(
// '79228162514264337593543950336'
// )]
// BCMath
$data = Bencode::decode(
"d3:inti79228162514264337593543950336ee",
bigInt: Bencode\BigInt::BCMATH,
);
// ['int' => new \BcMath\Number(
// '79228162514264337593543950336'
// )]
// brick/math
$data = Bencode::decode(
"d3:inti79228162514264337593543950336ee",
bigInt: Bencode\BigInt::BRICK_MATH,
);
// ['int' => \Brick\Math\BigInteger::of(
// '79228162514264337593543950336'
// )]
// Math_BigInteger from PEAR
$data = Bencode::decode(
"d3:inti79228162514264337593543950336ee",
bigInt: Bencode\BigInt::PEAR,
);
// ['int' => new \Math_BigInteger(
// '79228162514264337593543950336'
// )]
Internal Type#
Added in version 1.6/2.6.
The library also has built in BigIntType
.
It does not require any external dependencies but also does not allow any manipulation:
<?php
use Arokettu\Bencode\Bencode;
$data = Bencode::decode(
"d3:inti79228162514264337593543950336ee",
bigInt: Bencode\BigInt::INTERNAL,
);
// ['int' => new \Arokettu\Bencode\Types\BigIntType(
// '79228162514264337593543950336'
// )]
BigIntType is a value object with several getters:
<?php
use Arokettu\Bencode\Bencode;
// simple string representation:
$str = $data->value; // readonly property
// converters to the supported libraries:
$obj = $data->toGMP();
$obj = $data->toBcMath();
$obj = $data->toPear();
$obj = $data->toBrickMath();
Custom Handling#
Added in version 1.6/2.6.
Changed in version 4.0: Passing class names as handlers was removed
Like listType and dictType you can use a callable:
<?php
use Arokettu\Bencode\Bencode;
$data = Bencode::decode(
"d3:inti79228162514264337593543950336ee",
bigInt: fn (string $value) => $value,
); // ['int' => '79228162514264337593543950336']
Working with files#
Load data from a file:
<?php
use Arokettu\Bencode\Bencode;
$data = Bencode::load('testfile.torrent');
Working with streams#
Added in version 1.5/2.5.
Load data from a seekable readable stream:
<?php
use Arokettu\Bencode\Bencode;
$data = Bencode::decodeStream(fopen('...', 'r'));
Decoder object#
Added in version 1.7/2.7/3.0.
Decoder object can be configured on creation and used multiple times:
<?php
use Arokettu\Bencode\Decoder;
$decoder = new Decoder(bigInt: Bencode\BigInt::INTERNAL);
// all calls available:
$decoder->decode($encoded);
$decoder->decodeStream($stream);
$decoder->load($filename);