Packer.php 2.98 KiB
<?php
namespace SmartData\Utility;
trait Pack
{
public function uInt8($field) { return pack('C', $field); }
public function int8($field) { return pack('c', $field); }
public function uChar($field) { return uInt8($field); }
public function char($field) { return int8($field); }
public function uInt16($field) { return pack("v", $field); }
public function int16($field) { return self::uInt16($field); }
public function uInt32($field) { return pack("V", $field); }
public function int32($field) { return self::uInt32($field); }
public function uInt64($field) { return pack("P", $field); }
public function int64($field) { return self::uInt64($field); }
public function f32($field) { return pack('g', $field); }
public function d64($field) { return pack('e', $field); }
public function string($field) { return self::uInt8(strlen($field)) . $field; }
}
trait Unpack
{
public function uInt8(& $bin, $cut=false)
{
$uInt8 = substr($bin, 0, 1);
if($cut)
$bin = substr($bin, 1);
return unpack('C', $uInt8)[1];
}
public function int8(& $bin, $cut=false)
{
$int8 = self::uInt8($bin, $cut);
return ($int8>0x7F) ? ($int8 - 0x100) : $int8;
}
public function uChar(& $bin, $cut=false) { return self::uInt8($bin, $cut); }
public function char(& $bin, $cut=false) { return self::int8($bin, $cut); }
public function uInt16(& $bin, $cut=false)
{
$uInt16 = substr($bin, 0, 2);
if($cut)
$bin = substr($bin, 2);
return unpack('v', $uInt16)[1];
}
public function int16(& $bin, $cut=false)
{
$int16 = self::uInt16($bin, $cut);
return ($int16>0x7FFF) ? ($int16 - 0x10000) : $int16;
}
public function uInt32(& $bin, $cut=false)
{
$uInt32 = substr($bin, 0, 4);
if($cut)
$bin = substr($bin, 4);
return unpack('V', $uInt32)[1];
}
public function int32(& $bin, $cut=false)
{
$int32 = self::uInt32($bin, $cut);
return ($int32>0x7fffffff) ? ($int32 - 0x100000000) : $int32;
}
public function uInt64(& $bin, $cut=false)
{
$uInt64 = substr($bin, 0, 8);
if($cut)
$bin = substr($bin, 8);
return unpack('P', $uInt64)[1];
}
public function int64(& $bin, $cut=false)
{
$int64 = self::uInt64($bin, $cut);
return $int64;
}
public function f32(& $bin, $cut=false)
{
$f32 = substr($bin, 0, 4);
if($cut)
$bin = substr($bin, 4);
return unpack('g', $f32)[1];
}
public function d64(& $bin, $cut=false)
{
$d64 = substr($bin, 0, 8);
if($cut)
$bin = substr($bin, 8);
return unpack('e', $d64)[1];
}
public function string(& $bin, $cut=false)
{
$size = self::uInt8($bin);
$string = substr($bin, 1, $size);
if($cut)
$bin = substr($bin, $size+1);
return $string;
}
}