关于pack和unpack函数,官方介绍的一点疑问,

        public static function uInt64($i, $endianness=false) {
            $f = is_int($i) ? "pack" : "unpack";

            if ($endianness === true) {  // big-endian
                $i = $f("J", $i);
            }
            else if ($endianness === false) {  // little-endian
                $i = $f("P", $i);
            }
            else if ($endianness === null) {  // machine byte order
                $i = $f("Q", $i);
            }

            return is_array($i) ? $i[1] : $i;
        }

官方有介绍到‘J’、‘P’、‘Q’ 3种模式的用法,但我实际测试的时候缺发现一个问题,它这个函数写的是uInt64,就是无符号64位的int,但我实际测试的时候

$k=chr(200)."\t\0\t\t\t\t".chr(200);
var_dump(unpack("P",$k));
var_dump(unpack("J",$k));
var_dump(unpack("Q",$k));

array(1) {
[1]=>
int(-4032682056923215416)
}
array(1) {
[1]=>
int(-4032691952527275576)
}
array(1) {
[1]=>
int(-4032682056923215416)
}
打印的结果确是有符号的64位,有人知道是为啥么?如果是官方写错了,那转uInt64用到的是那几个参数呢?

最佳答案

你也看到了,你var_dump打印出来的是int,因为php压根没有uint

1年前 评论
poker_face (楼主) 1年前
renxiaotu (作者) 1年前
poker_face (楼主) 1年前
renxiaotu (作者) 1年前
poker_face (楼主) 1年前
讨论数量: 7

你也看到了,你var_dump打印出来的是int,因为php压根没有uint

1年前 评论
poker_face (楼主) 1年前
renxiaotu (作者) 1年前
poker_face (楼主) 1年前
renxiaotu (作者) 1年前
poker_face (楼主) 1年前
$p=chr(200)."\t\0".chr(200);
var_dump(unpack("N",$p));
var_dump(unpack("V",$p));
var_dump(unpack("L",$p));

打印出来是 array(1) { [1]=> int(3356033224) } array(1) { [1]=> int(3355445704) } array(1) { [1]=> int(3355445704) }

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!