2017-02-02 19 views
2

BigIntegerクラスの2つのコンストラクタであるBigInteger(String)BigInteger(byte[])が同じように動作することを期待していましたが、そうではありません。BigInteger(String)とBigInteger(byte [])が等しくない

2つのBigIntegerが等しくないのはなぜですか?バイト配列からBigIntegerを作成するにはどうすればよいですか?

String hex = "94B4"; 
byte[] b = DatatypeConverter.parseHexBinary(hex); // -108, -76 

BigInteger b1 = new BigInteger(hex, 16); //38068 
BigInteger b2 = new BigInteger(b); //-27468 

答えて

2

進コンストラクタは、16進文字列、よく、として扱い、一方byte[]コンストラクタは、通常の2の補数データとして入力を扱うように見えます。

new BigInteger(int signum, byte[] magnitude)を使用すると、値をプラスにすることができます。したがって、new BigInteger(1, b)38068になります。

1

それは38068 + 27468は65536

java.lang.Stringは文字の配列であり、Javaでchar符号なし 16ビット型であることを忘れないでくださいであることを驚きとして来るでしょう。ニース。

BigInteger b2 = new BigInteger(b);はこれを回避します。これは、データを2の補数として解釈します。 16ビットタイプです。

したがって、違いがあります。