PHP:有符号二进制字符串

PHP:有符号二进制字符串,php,flash,bits,Php,Flash,Bits,我在将二进制字符串转换为有符号整数时遇到问题 如果调用decbin('-40'),php将输出111111111111111111111111111111111111011000 但是如果调用bindec(decbin('-40'),它将输出1.84467440737E+19(或类似的东西,显然不是-40),因为它“将最高有效位视为另一个数量级,而不是符号位”-php手册 有没有办法将二进制64位二进制字符串(与decbin输出的字符串非常相似)转换为带符号整数?使用and在int和二进制字符串

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

如果调用decbin('-40'),php将输出111111111111111111111111111111111111011000

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

有没有办法将二进制64位二进制字符串(与decbin输出的字符串非常相似)转换为带符号整数?

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

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

从文档中,您不能使用
bindec

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

base\u convert
似乎完全忽略签名

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);
}
如果您知道传入字符串将始终为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);
}
函数bindec2($bin)
{
如果(strlen($bin)==64&&$bin[0]==1'){
对于($i=0;$i<64;$i++){
$bin[$i]=$bin[$i]=='1'?'0':'1';
}
返回(bindec($bin)+1)*-1;
}
返回bindec($bin);
}

试试base\u convert函数。请看下面的评论:我没有使用-40的特权,我的朋友,我的数据是以bindecThank you的格式输出的!这很有魅力!我拥有的数据实际上是最小化的,以节省空间,我填充额外的1或0,使其实际为64位长-并且系统是64位系统,因此我认为删除长度检查不会出现任何问题。