3

16進文字列を符号付き整数に変換しようとしています。

hexdec()を使用して符号なしの値に簡単に転送できますが、これでは符号付きの値が得られません。

編集:

VBのコード-2つの「AA」16進値が代表的です。

Dim bs(2) As Byte
bs(1) = "AA"
bs(2) = "AA"
Dim s As Short
s = BitConverter.ToInt16(bs, 1)
4

3 に答える 3

4

php.net経由でこのコメントをチェックしてください:

hexdec()は符号なし整数を返します。たとえば、hexdec( "FFFFFFFE")は、-2ではなく4294967294を返します。符号付き32ビット整数に変換するには、次のようにします。

<?php
echo reset(unpack("l", pack("l", hexdec("FFFFFFFE"))));
?>
于 2012-09-11T11:51:33.257 に答える
3

hexdecのマニュアルページで述べたように:

この関数は、プラットフォームの整数型に対して大きい値を変換できるようになりました。その場合、代わりに値をfloatとして返します。

ある種の大きな整数(floatではない)を取得したい場合は、文字列内に格納する必要があります...これはBCMath関数を使用して可能になる場合があります。

たとえば、hexdecのマニュアルページのコメントを見ると、このメモが見つかります。

その関数を少し適応させると、通知を避けるために、次のようになります。

function bchexdec($hex)
{
    $dec = 0;
    $len = strlen($hex);
    for ($i = 1; $i <= $len; $i++) {
        $dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));
    }
    return $dec;
}

(この関数は、私がリンクしたメモからコピーされています;そして私が少しだけ適応させました)

そしてあなたの番号でそれを使用する:

$h = 'D5CE3E462533364B';
$f = bchexdec($h);
var_dump($f);

出力は次のようになります:

string '15406319846273791563' (length=20)

だから、あなたが持っていたような大きなフロートではありません; そしてあなたが期待していることで大丈夫のようです:

calc.exeからの結果=15406319846273791563


この助けを願っています;-)
そして、はい、PHPドキュメントのユーザーノートは時々本当の金鉱です;-)

于 2012-09-11T11:40:08.020 に答える
2

私はこの質問に対する適切な答えを見つけようとしてきたので、16進文字列入力に対して適切に機能し、符号付き10進値を返すこの関数を作成しました。

public function hex_to_signed_int($hex_str){
    $dec = hexdec($hex_str);
    //test is value negative
    if($dec & pow(16,strlen($hex_str))/2 ){ return $dec-pow(16,strlen($hex_str));}
    return $dec;
}
于 2021-11-29T13:28:37.990 に答える