Skip to content
Snippets Groups Projects
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;
    }
}