加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP:签名二进制字符串

发布时间:2020-12-13 16:17:45 所属栏目:PHP教程 来源:网络整理
导读:我在将二进制字符串转换为有符号整数时遇到问题 如果你调用decbin(‘ – 40’),php将输出2222222222222222222222222222222222222222222222222222222111011000 但是如果你调用bindec(decbin(‘ – 40’)),它将输出1.84467440737E 19(或类似的东西,显然不是-40
我在将二进制字符串转换为有符号整数时遇到问题

如果你调用decbin(‘ – 40’),php将输出2222222222222222222222222222222222222222222222222222222111011000

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

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

解决方法

从文档中,您不能使用bindec

bindec() interprets all binary_string values as unsigned integers. This is because bindec() sees the most significant bit as another order of magnitude rather than as the sign bit.

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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读