16 進数で満たされたバイト配列がありますが、印刷できない要素が多数あるため、簡単な方法で印刷するのはほとんど意味がありません。必要なのは、次の形式の正確な 16 進コードです。3a5f771c
ベストアンサー1
議論からここ、 そして特にこれ回答、これは私が現在使用している機能です:
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 万バイトを 1,000 回、256 バイトを 1,000 万回) では、他のどの方法よりもずっと高速で、長い配列では約半分の時間で済むことが示されました。私が参考にした回答と比較すると、ディスカッションで提案されているようにビット単位の演算に切り替えると、長い配列の時間が約 20% 短縮されました。(編集: 代替方法よりも高速だと言ったのは、ディスカッションで提案された代替コードを意味します。パフォーマンスは、非常によく似たコードを使用する Commons Codec と同等です。)
2k20 バージョン、Java 9 コンパクト文字列に関して:
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);
}