-1

重複の可能性:
Java を使用して、16 進ダンプの文字列表現をバイト配列に変換しますか?

文字列をバイトに変換したいのです"1B4322C2"が、問題は、それを使用getBytes()すると文字列の長さの2倍のバイトに変換され、文字列の長さの半分に変換したいということです。

たとえば、上記の文字列の出力は{0x1B , 0x43, 0x22, 0xC2}

ありがとうございました

4

6 に答える 6

5

(私は今、重複として閉じることに投票しました。これは最初に行うべきでした...しかし、質問が削除されるまでこの回答をここに残すことは理にかなっています...)

そうですね、実際にやりたいことは、16 進文字列を解析することです。

Apache Commons Codecを確認する必要があります。これには、Hexまさにその目的のためのクラスがあります。個人的に私は API に夢中ではありませんが、これはうまくいくはずです:

Hex hex = new Hex();
byte[] data = (byte[]) hex.decode(text);

または:

byte[] data = Hex.decodeHex(text.toCharArray());

(個人的には、そのまま使用できることを望みますが、必要にbyte[] data = Hex.decodeHexString(text);応じて独自のラッパー メソッドをいつでも作成できます。)

サード パーティのライブラリを使用したくない場合は、Stack Overflow の他の場所に実装がたくさんあります (例: this one ) 。

于 2012-12-05T07:19:31.517 に答える
2

「1B4322C2」をバイトとしてエンコードするには、使用できます

byte[] bytes = new BigInteger("FB4322C2", 16).toByteArray();
if (bytes.length > 1 && bytes[0] == 0)
    bytes = Arrays.copyOfRange(bytes, 1, bytes.length);
System.out.println(Arrays.toString(bytes));

版画

[-5, 67, 34, -62]
于 2012-12-05T09:11:56.807 に答える
1

外部ライブラリを使用したくない場合は、これでいくつかの調整を行う必要があります (0x と { } を追加)。

public static String byteArrayToHexadecimal(byte[] raw) {
    final BigInteger bi = new BigInteger(1, raw);
    final String result = bi.toString(16);
    if (result.length() % 2 != 0) {
        return "0" + result;
    }
    return result;
}

申し訳ありませんが、逆に(私にとってはボトルネックではなかったので、最適化されていません):

public static byte[] hexadecimalToByteArray(String hex) {
    if (hex.length() % 2 != 0) {
        hex = "0" + hex;
    }
    final byte[] result = new byte[hex.length() / 2];
    for (int i = 0; i < hex.length(); i += 2) {
        String sub = "0x" + hex.substring(i, i + 2);
        result[i / 2] = (byte) ((int) Integer.decode(sub));
    }
    return result;
}

ただし、J. Skeet が提案するように、Apache Commons Codec を使用することをお勧めします。

于 2012-12-05T07:23:23.807 に答える
1

String Tokenizer または String Builder を使用して文字列を分離し、ヘキサから文字列に変換できます...

このリンクはあなたに役立つかもしれません..
16進数をASCIIに変換する

お役に立てれば..

于 2012-12-05T07:19:27.810 に答える
0

String.getBytes() メソッドは必要ありません。これにより、文字列の文字がバイト表現に変換されます。

やりたいことを行うには、文字列を手動で個々の文字列に分割する必要があります。ペアごとに 1 つずつです。次に、それらを解析する必要があります。

残念ながら、Java には符号なしバイトがなく、0xC2 はオーバーフローします。メモリが問題にならない場合は、おそらく値を short または整数として扱いたいと思うでしょう。

したがって、Integer クラスを使用して文字列を数値に解析できます。文字列は 16 進数であるため、基数を指定できる parse メソッドを使用する必要があります。

String test = "1B4322C2";

for (int bnum = 0; bnum < test.length() / 2; bnum++) {
    String bstring = test.substring(bnum * 2, bnum * 2 + 2);
    int bval = Integer.parseInt(bstring, 16);
    System.out.println(bstring + " -> " + bval);
}

これは出力されます:

1B -> 27
43 -> 67
22 -> 34
C2 -> 194

配列でそれらが必要な場合は、文字列の幅の半分の配列をインスタンス化し、各値をそのbnumインデックスの下に配置できます。

于 2012-12-05T07:32:44.120 に答える
0

getBytes各文字をバイト形式の文字コードに変換します。文字列自体からバイト値を解析しません。そのためには、おそらく独自の解析関数を作成する必要があります。

于 2012-12-05T07:19:21.610 に答える