0

私はこのような文字列を持っています

String text = "f001050000000000003d61c1c1df400200c0000009181600ef014000003f20"

バイトに変換して、バイトとしてループします

byte[] bytes = new BigInteger(text,16).toByteArray();        
    for (int i = 0; i < bytes.length; i++) 
    {            
        System.out.print(String.format("%02x ", bytes[i]));
    }

しかし、配列値を出力する00と、実際の文字列の先頭にバイトが追加されます! で始まる必要f0がありますが、で始まります00!

1これでインデックスを開始すると00消えます。これはどこから00来たの!?

4

2 に答える 2

4

BigInteger#toByteArray()のJavaDocは次のように述べています。

このBigIntegerの2の補数表現を含むバイト配列を返します。バイト配列はビッグエンディアンのバイトオーダーになります。最上位バイトは0番目の要素にあります。配列には、このBigIntegerを表すために必要な最小バイト数が含まれます。これには、少なくとも1つの符号ビット((ceil((this.bitLength() + 1)/8))。[...])が含まれます。

正の数があるため、最初のビットは2の補数でゼロになります。

于 2013-01-31T00:04:04.127 に答える
1

BigInteger はこのタスクには適していないと思います。テキストを自分で解析する必要がありますが、難しくありません

    byte[] bytes = new byte[text.length() / 2];
    for (int i = 0; i < bytes.length; i++) {
        bytes[i] = (byte) ((Character.digit(text.charAt(i * 2), 16) << 4) + Character.digit(text.charAt(i * 2 + 1), 16));
    }

「0000f0...」も正しく変換されるわけではありませんが、BigInteger の場合は単なる数値であるため、BigInteger は先頭のゼロを切り捨てます (正規化します)。

于 2013-01-31T05:35:06.823 に答える