1

次のように base_convert 関数を使用して、60 ビットのバイナリ データを 16 進コードに変換したいと考えています。しかし、結果は正しくありません。以下のコードの出力は 4e08556312ffc00 ですが、正しい出力は 4E08556312FFBFF です。理由を教えてもらえますか?関数に対して 60 ビットは大きすぎますか?

echo "The beacon ID in Hexadecimal is".base_convert
         ("010011100000100001010101011000110001001011111111101111111111",2, 16);

感謝

4

4 に答える 4

2

別の質問hereへの回答に、そのような制限のない基本変換関数の実装を投稿しました。

于 2012-06-22T09:49:09.837 に答える
0

base_convertおよび浮動小数点数のドキュメントによるとbase_convert、大きな数値では精度が失われます。

代わりに、bin2hex制限されていない を使用できます (この関数は文字列を使用して返します)

于 2012-06-22T09:15:03.137 に答える
0

次のうち大きい方です。

  1. PHP_INT_MAX
  2. float として表現できる連続した整数のセットの最大値。

一般的な PHP 実装では、浮動小数点数の実装に IEEE 754 を使用します。浮動小数点数の有効桁数は 53 ビットです。そのため、32 ビット環境の一般的な制限は 2⁵³ ( 0x20000000000000) であり、64 ビット環境の制限は 2⁶³-1 ( 0x7fffffffffffffff) です。

PHP gmp 拡張 ( http://php.net/gmp )がある場合は、簡単な解決策があります。

$hexNumber = gmp_strval( gmp_init( $binNumber, 2 ), 16 ) ;

bc 拡張機能 ( http://php.net/bc ) がある場合、私の (無料でオープン ソースの) WeirdoCustomDigits モジュールは、任意の基数と任意の数字文字を制限なく変換します。

例のように、基数 2 と基数 16 の間で単純に変換する場合は、bc や gmp を使用せずに済ませることができます。WeirdoCustomDigits::binFromHex() および WeirdoCustomDigits::hexFromBin() については、WeirdoCustomDigits モジュールのソースを参照してください。

于 2014-03-12T06:26:03.957 に答える
0

私のテストでは、43 ビットを超えると精度が低下することがわかりました。

私はデフォルト設定でWin XPベース+ easyphp 3.1.81に取り組んでいます。

私は系図アプリケーションにこの base_convert を使用していますが、43 世代という制限は - 時には - 十分ではありません。

于 2013-07-08T10:59:12.387 に答える