PHP:签名二进制字符串

时间:2012-08-14 06:12:36

标签: php flash bits

我遇到将二进制字符串转换为有符号整数的问题

如果你打电话给decbin(' - 40'),php会输出1111111111111111111111111111111111111111111111111111111111011000

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

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

2 个答案:

答案 0 :(得分:2)

从文档中,您无法使用bindec

  

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

base_convert似乎完全忽略了签名。

如果您知道传入的字符串将始终为64位二进制文​​件而您在32位系统上,则编写自定义函数非常容易。< / p>

  • 检查字符串是否长度为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);
}

答案 1 :(得分:0)

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

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