在php中,整型在直接echo,写入到文件时与字符串是一样的,这一点与C语言不一样。不能想当然地直接对整数执行解包(unpack)操作。
因此要将整形转换成16进制显示时,应先pack成真正的整型字节存储形式,然后再以16进制格式unpack。
下面看一下直接将整数unpack会如何
<?php
//整数255直接unpack成16进制,结果是3235,而不是预想的ff
$i=255;
$s = unpack('H4s',$i)['s'];
echo $s;
echo "\n";
以上结果是3235,而不是预想的ff。
正确的转换步骤如下:
<?php
//整数255表示为16进制串
$i=255;
//转换成16位整数时,选择大端序,在字节顺序上符合人们的一般习惯,即高位在前(在字节流的前面)。
$b=pack('n',$i);
//转换成16进制串时,一次性吃进半个字节,所以这里要解包4次,
//一般人的阅读习惯,16进制表示的字符串都是高位(半字节)在前,所以格式符选H而不选h
$s = unpack('H4s',$b)['s'];
echo $s;
echo "\n";
//整数266表示为16进制串
$i=266;
$b=pack('n',$i);
$s = unpack('H4s',$b)['s'];
echo $s;
echo "\n";
//取整数266的第2个字节
$i=266;
$b=pack('n',$i);
$b1=substr($b, 1);
$s = unpack('H2s',$b1)['s'];
echo $s;
echo "\n";