暂时没有睡觉,所以我可能会遗漏一些简单的东西。基本上,我正在取一个数字并将其转换为三个字符。最大可能数为256 * 256 * 256(16777216)。我转换它:
public function s_encode($num) {
$num = chr($num / 65536).chr($num / 256).chr($num % 256);
return bin2hex($num);
}
并将其转换回:
public function s_decode($hex) {
$a = pack("H*", $hex);
$b = ord(substr($a, 1, 1));
$c = ord(substr($a, 2, 1));
$d = ord(substr($a, 0, 1));
return (($d * 65536) + ($b * 256)) + $c;
}
奇怪的是,这确实有效。它做了我想要的,但它怎么可能呢?在第一个代码中,我将其转换为三个字符,转换的第二部分是:
chr($num / 256)
如果数字大于65536,这应该会导致错误,但事实并非如此。如果我使用unpack而不是bin2hex,则会导致错误。 bin2hex不会。 bin2hex为何以及如何如此神奇?
答案 0 :(得分:2)
chr()
仅查看其输入的最低8位:
echo "'".chr(320)."'";
...产量
'@'
同样......
echo "'".chr(64)."'";
答案 1 :(得分:2)
根据php docs中的注释,chr
将采用模256的参数。甚至负整数也起作用。 bin2hex
不执行该操作,并且无效输入失败。