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とbinarystringの間で変換します。

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