PHP:bin2hex并使用不可能的数字

时间:2012-07-05 22:11:13

标签: php

暂时没有睡觉,所以我可能会遗漏一些简单的东西。基本上,我正在取一个数字并将其转换为三个字符。最大可能数为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为何以及如何如此神奇?

2 个答案:

答案 0 :(得分:2)

chr()仅查看其输入的最低8位:

echo "'".chr(320)."'";

...产量

'@'

同样......

echo "'".chr(64)."'";

http://ideone.com/65Itz

答案 1 :(得分:2)

根据php docs中的注释,chr将采用模256的参数。甚至负整数也起作用。 bin2hex不执行该操作,并且无效输入失败。