1. ホーム
  2. java

[解決済み] Javaでバイト配列から16進文字列に変換する方法は?

2022-03-14 07:45:53

質問

16進数で埋め尽くされたバイト配列があるのですが、印刷できない要素が多いので、簡単な方法で印刷しても意味がないのです。私が必要とするのは、正確な16進数のコードで、以下のような形式です。 3a5f771c

どのように解決するのですか?

ディスカッションより こちら そして、特に これ という質問に対して、私が現在使っている機能です。

private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = HEX_ARRAY[v >>> 4];
        hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
    }
    return new String(hexChars);
}

私自身の小さなベンチマーク(100万バイトを1000回、256バイトを1000万回)では、他のどの選択肢よりもずっと速く、長い配列では約半分の時間で済むことがわかりました。 私が参考にした回答と比較すると、ディスカッションで提案されたビット演算に切り替えることで、長い配列の処理時間を約20%短縮することができました。(Edit: 私が「他の方法より速い」と言ったのは、ディスカッションで提案された代替コードのことです。性能は、非常に似たコードを使用しているCommons Codecと同等です)。

2k20版、Java9コンパクト文字列を基準にしています。

private static final byte[] HEX_ARRAY = "0123456789ABCDEF".getBytes(StandardCharsets.US_ASCII);
public static String bytesToHex(byte[] bytes) {
    byte[] hexChars = new byte[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = HEX_ARRAY[v >>> 4];
        hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
    }
    return new String(hexChars, StandardCharsets.UTF_8);
}