2012-08-14 114 views
4

我在与转换二进制字符串符号整数PHP:符号二进制字符串

一个问题,如果你调用decbin(“ - 40”),PHP将输出1111111111111111111111111111111111111111111111111111111111011000

但是,如果你调用bindec( decbin(' - 40')),它会输出1.84467440737E + 19(或类似的东西,显然不是-40),因为它“把最重要的位看作另一个数量级而不是符号位”。手册

有没有办法将一个二进制64位二进制字符串(非常像decbin输出)转换成一个字符串有符号整数?

+0

尝试使用base_convert函数。 – Niloct 2012-08-14 06:24:24

+0

看到这个评论:http://docs.php.net/manual/da/function.bindec.php#79072 – complex857 2012-08-14 06:35:09

回答

1

从文档,您不能使用bindec

bindec()解释所有binary_string值作为无符号整数。这是因为bindec()将最重要的位视为另一个数量级而不是符号位。

base_convert似乎完全忽略了签名。

如果你知道你的到来串永远是64位二进制,你在32位系统上不,它很容易编写自定义的功能。

  • 检查字符串是否是64个字符长。
  • 检查最显著位是1
  • 翻转所有位
  • 添加1
  • 取反

这里有一个快速的一个我敲了起来。

function bindec2($bin) 
{ 
    if (strlen($bin) == 64 && $bin[0] == '1') { 
     for ($i = 0; $i < 64; $i++) { 
      $bin[$i] = $bin[$i] == '1' ? '0' : '1'; 
     } 

     return (bindec($bin) + 1) * -1; 
    } 
    return bindec($bin); 
} 
+0

谢谢!这就像一个魅力!我所拥有的数据实际上被最小化以节省空间,并且我额外填充了1或0来实际上使其长64位 - 而且系统是64位系统,所以我不认为我会通过删除长度检查。 – user1481075 2012-08-14 06:45:00

0

使用packunpack在int和二进制字符串之间进行转换。

// 'i' means signed integer 
var_dump(unpack('i', pack('i', '-40'))); // gives you -40 
+0

我没有使用-40我的朋友的豪华,我有的数据是格式输出bindec – user1481075 2012-08-14 06:39:15