web-dev-qa-db-ja.com

Javaでは、16進文字列をbyte []に​​変換するにはどうすればよいですか?

Javaで以下の関数を使用して、暗号化された文字列を16進形式に変換しています。

public static String toHex(byte [] buf) {
    StringBuffer strbuf = new StringBuffer(buf.length * 2);
    int i;
    for (i = 0; i < buf.length; i++) {
        if (((int) buf[i] & 0xff) < 0x10) {
            strbuf.append("0");
        }
        strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
    }
    return strbuf.toString();
}

ここで、その16進文字列をバイト配列に戻したいと思います。どうやってやるの?

例えば、

(1) Plain Text = 123
(2) Encrypted Text = «h>kq*«¬Mí“~èåZ  \}?
(3) Encrypted Text in Hex = f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e

(2)から(3)に移動できますが、(3)から(2)に戻る方法を教えてください。

33
Bhavik Ambani
 String s="f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e";
 byte[] b = new BigInteger(s,16).toByteArray();
43
Kushan

受け入れられた答えは、問題を引き起こす可能性のある先行ゼロを考慮しません

この質問 は答えます。その実行方法を確認するか、Java組み込みメソッドを使用するかによって異なります。上記のSO質問からの this および this 回答からコピーされたソリューションを次に示します。

オプション1:Utilメソッド

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

オプション2:ワンライナービルドイン

import javax.xml.bind.DatatypeConverter;

public static String toHexString(byte[] array) {
    return DatatypeConverter.printHexBinary(array);
}

public static byte[] toByteArray(String s) {
    return DatatypeConverter.parseHexBinary(s);
}
95
dARKpRINCE

DatatypeConverter.parseHexBinaryの方が(2倍)コストが高いことがわかりました。

org.Apache.commons.codec.binary.Hex(str.toCharArray())
5
Rony Joy