如何在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

上一篇: How to convert a byte array to a hex string in Java?

下一篇: SVG fill color transparency / alpha?