16 進数値を表す長い文字列 (ダンプから) をバイト配列に変換する方法を探しています。
投稿した人よりうまく表現できなかったここでも同じ質問。
しかし、オリジナル性を保つために、私は独自の言い方をします。"00A0BF"
次のように解釈したい文字列があるとします。
byte[] {0x00,0xA0,0xBf}
どうすればいいですか?
私は Java 初心者ですが、BigInteger
先頭の 16 進ゼロに注意しながら使用しています。しかし、これは見苦しいと思いますし、何か単純なことを見逃しているに違いありません。
ベストアンサー1
アップデート(2021) - Java 17には以下が含まれますjava.util.HexFormat
(たった25年かかりました)
HexFormat.of().parseHex(s)
古いバージョンの Java の場合:
これまでに投稿されたものよりも優れていると思う解決策は次のとおりです。
/* s must be an even-length string. */
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;
}
改善された理由:
先頭のゼロ(BigInteger とは異なります)と負のバイト値(Byte.parseByte とは異なります)でも安全です。
String を に変換したり
char[]
、バイトごとに StringBuilder および String オブジェクトを作成したりしません。利用できない可能性のあるライブラリ依存関係はありません
assert
引数が安全かどうかわからない場合は、 または例外を介して引数チェックを自由に追加してください。