Javaでバイト配列を16進数文字列に変換することは、デバッグ、ログ記録、データ転送などでよく行われる一般的なタスクです。この記事では、この変換を効率的に行うためのいくつかの方法を検討し、それらのパフォーマンスと使いやすさを比較します。
目次
HEX_ARRAYを使った手動変換
この方法は、事前に定義された文字配列を使用して、バイト値をその16進数表現にマッピングします。小さなバイト配列に対しては良好なパフォーマンスを提供し、外部依存関係を回避します。
public class ByteArrayToHex {
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 >> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
public static void main(String[] args) {
byte[] byteArray = { (byte) 0xA1, (byte) 0xB2, (byte) 0xC3, (byte) 0xD4 };
String hexString = bytesToHex(byteArray);
System.out.println("Hex string: " + hexString); // 出力: Hex string: A1B2C3D4
}
}
Apache Commons Codecの使用
Apache Commons Codecライブラリは、便利なHex.encodeHexString()
メソッドを提供します。これは堅牢で広く使用されているソリューションですが、プロジェクトに依存関係を追加する必要があります(例:Mavenを使用)。
import org.apache.commons.codec.binary.Hex;
public class ByteArrayToHexApache {
public static void main(String[] args) {
byte[] byteArray = { (byte) 0xA1, (byte) 0xB2, (byte) 0xC3, (byte) 0xD4 };
String hexString = Hex.encodeHexString(byteArray);
System.out.println("Hex string: " + hexString); // 出力: Hex string: A1B2C3D4
}
}
DatatypeConverterの活用
Javaの組み込みjavax.xml.bind.DatatypeConverter
クラス(Java 6以降で使用可能)は、printHexBinary()
メソッドを提供します。これはシンプルで、依存関係のないオプションです。
import javax.xml.bind.DatatypeConverter;
public class ByteArrayToHexDatatypeConverter {
public static void main(String[] args) {
byte[] byteArray = { (byte) 0xA1, (byte) 0xB2, (byte) 0xC3, (byte) 0xD4 };
String hexString = DatatypeConverter.printHexBinary(byteArray);
System.out.println("Hex string: " + hexString); // 出力: Hex string: A1B2C3D4
}
}
String Formattingによるアプローチ
この方法は、ループ内でString.format()
を使用します。機能しますが、繰り返しの文字列連結によるオーバーヘッドのため、特に大きなバイト配列の場合、他の方法よりも一般的に効率が悪くなります。
public class ByteArrayToHexAppendFormat {
public static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X", b));
}
return sb.toString();
}
public static void main(String[] args) {
byte[] byteArray = { (byte) 0xA1, (byte) 0xB2, (byte) 0xC3, (byte) 0xD4 };
String hexString = bytesToHex(byteArray);
System.out.println("Hex string: " + hexString); // 出力: Hex string: A1B2C3D4
}
}
パフォーマンス比較
小さなバイト配列の場合、これらの方法間の性能の違いは無視できます。しかし、大きな配列の場合、手動のHEX_ARRAY
メソッドとApache Commons Codec
は、一般的にString.format()
アプローチよりも優れたパフォーマンスを示します。DatatypeConverter
は、外部依存関係なしで、パフォーマンスと使いやすさのバランスの良い選択肢を提供します。
最適な選択肢は、プロジェクトの具体的なニーズによって異なります。パフォーマンスが重要で、大規模なデータセットを扱う場合は、HEX_ARRAY
メソッドまたはApache Commons Codec
をお勧めします。シンプルさと外部依存関係の回避を優先する場合は、DatatypeConverter
が優れた選択肢です。