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)
php.net経由でこのコメントをチェックしてください:
hexdec()は符号なし整数を返します。たとえば、hexdec( "FFFFFFFE")は、-2ではなく4294967294を返します。符号付き32ビット整数に変換するには、次のようにします。
<?php
echo reset(unpack("l", pack("l", hexdec("FFFFFFFE"))));
?>
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ドキュメントのユーザーノートは時々本当の金鉱です;-)
私はこの質問に対する適切な答えを見つけようとしてきたので、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;
}