如何在Java中将字节数组转换为十六进制字符串?
我有一个用十六进制数字填充的字节数组,打印它的简单方法是毫无意义的,因为有许多不可打印的元素。 我需要的是以下形式的确切十六进制码: 3a5f771c
从这里的讨论,特别是这个答案,这是我目前使用的功能:
private final static char[] hexArray = "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] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
我自己的微小基准测试(一千万字节千次,256字节千万次)表明它比其他任何替代方法快得多,大约是长阵列一半的时间。 与我之前的答案相比,切换到按位操作 - 如讨论中所建议的那样 - 将长阵列的时间减少了20%。 (编辑:当我说它比其他代码更快时,我的意思是讨论中提供的替代代码,性能等同于Commons Codec,它使用非常相似的代码。)
Apache Commons Codec库有一个Hex类来完成这种类型的工作。
import org.apache.commons.codec.binary.Hex;
String foo = "I am a string";
byte[] bytes = foo.getBytes();
System.out.println( Hex.encodeHexString( bytes ) );
使用DatatypeConverter.printHexBinary()
。 您可以在http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/DatatypeConverter.html中阅读其文档
例如:
byte bytes[] = {(byte)0, (byte)0, (byte)134, (byte)0, (byte)61};
System.out.println(javax.xml.bind.DatatypeConverter.printHexBinary(bytes));
将导致:
000086003D
正如你所看到的,这将检索表示带前导零的字节数组的十六进制字符串。
这个答案与问题中的基本相同在Java中,如何在保持前导零的同时将字节数组转换为十六进制数字字符串?
链接地址: http://www.djcxy.com/p/87085.html