4

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

如果调用decbin('-40'),php会输出1111111111111111111111111111111111111111111111111111111111011000

但是,如果您调用 bindec(decbin('-40')),它将输出 1.84467440737E+19(或类似的东西,显然不是 -40),因为它“将最高有效位视为另一个数量级,而不是符号位” - php 手册

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

4

2 回答 2

3

从文档中,您不能使用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);
}
于 2012-08-14T06:37:09.640 回答
0

使用packunpack在 int 和 binary string 之间进行转换。

// 'i' means signed integer
var_dump(unpack('i', pack('i', '-40'))); // gives you -40
于 2012-08-14T06:31:55.213 回答