Pack / unpack a 64-bit int on 64-bit architecture in PHP

前端 未结 4 1286
梦谈多话
梦谈多话 2020-12-19 14:30

Why do I get the following output on an x64 architecture?

$ php -r \'echo pow(2, 33) . \"\\n\";print_r(unpack(\"Ivalue\", pack(\"I\", pow(2, 33))));\'
858993         


        
4条回答
  •  暖寄归人
    2020-12-19 15:16

    Here is a function to pack an integer value of any size into N bits:

    function encode_int($in, $pad_to_bits=64, $little_endian=true) {
        $in = decbin($in);
        $in = str_pad($in, $pad_to_bits, '0', STR_PAD_LEFT);
        $out = '';
        for ($i = 0, $len = strlen($in); $i < $len; $i += 8) {
            $out .= chr(bindec(substr($in,$i,8)));
        }
        if($little_endian) $out = strrev($out);
        return $out;
    }
    

    Here is a function to decode the packed integers:

        function decode_int(&$data, $bits=false) {
                if ($bits === false) $bits = strlen($data) * 8;
                if($bits <= 0 ) return false;
                switch($bits) {
                        case 8:
                                $return = unpack('C',$data);
                                $return = $return[1];
                        break;
    
                        case 16:
                                $return = unpack('v',$data);
                                $return = $return[1];
                        break;
    
                        case 24:
                                $return = unpack('ca/ab/cc', $data);
                                $return = $return['a'] + ($return['b'] << 8) + ($return['c'] << 16);
                        break;
    
                        case 32:
                                $return = unpack('V', $data);
                                $return = $return[1];
                        break;
    
                        case 48:
                                $return = unpack('va/vb/vc', $data);
                                $return = $return['a'] + ($return['b'] << 16) + ($return['c'] << 32);
                        break;
    
                        case 64:
                                $return = unpack('Va/Vb', $data);
                                $return = $return['a'] + ($return['b'] << 32);
                        break;
    
                }
                return $return;
        }
    

提交回复
热议问题