php -r 'echo pack("H6", "E59B9E");'
注意H* 和 H6 类似表示 后面的arg 可以任意长
后面每个字符 作为十六进制的4位数字
如果是0xE5B9E 则 转换成字符串(十六进制转换字符串 源码中的convert_to_string_ex 是先转换成十进制 1233 即字符串形式)
H 表示 一次读取四位 不足8 需要补4位 (先转换成字符串)
整型相关pack
先转换成long 然后根据short int 或者long 分别取4个字节数字 组合成二进制流
@4 表示 当前位置到位置4 都变成 \0 (要求@后面指定的位置必须大于当前位置)
X 表示当前输出结果位置倒退一个格式(如果H6 在倒退6个字节)指定的字节。
x当前位置填充 NULL
echo pack("H2", "41") 输出 'A'
echo pack("H2", "40"); 输出 '@'
echo pack("H", "4"); 输出 '@' 说明不足8位的 以0填充
echo bin2hex(pack("c", 'a')); 输出 00
echo bin2hex(pack("c", '65')) 输出41
echo bin2hex(pack("S", '6511')); 输出 6f19
echo bin2hex(pack("S", 6511)); 输出 6f19 注意6511转换16进制是 196f
以上说明 pack c pack S都是将后面的 参数先intval 转换成整数 再 解析读取
echo bin2hex(pack("c", 1230));
输出 ce 十进制206 二进制 11001110
1230 转换二进制 10011001110
说明 pack('c" ,arg) 是将arg转换十进制 读取低8位 形成
echo bin2hex(pack("C", 129)); 81
echo bin2hex(pack("S", 129));8100 小端字节序
echo bin2hex(pack("s", 129)); 8100 小端字节序
说明 pack("S", arg) 是将arg转换成是二进制 数字后,读取低16位 不足补零
c C区别暂时未深入研究 好像木有区别 都是8位
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("cchars/nint", $binarydata);
print_r($array);
Array ( [chars] => 4 [int] => 160 )
注意这里的 十六进制字符串 直接转换为数字