1

有一段时间没睡了,所以我可能错过了一些简单的东西。基本上,我正在取一个数字并将其转换为三个字符。最大可能性数为 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 如此神奇?

4

2 回答 2

2

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

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

产量...

'@'

一样...

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

http://ideone.com/65Itz

于 2012-07-05T22:20:24.247 回答
2

根据php docs中的评论,chr将采用参数模 256。即使是负整数也可以。bin2hex不执行该操作,并且在无效输入上失败。

于 2012-07-05T22:21:27.407 回答