我有一个字节数组,里面填充了十六进制数,用简单的方式打印它是毫无意义的,因为有很多不可打印的元素.我需要的是精确的十六进制代码,格式为:3a5f771c

推荐答案

根据讨论here,尤其是this答案,这是我目前使用的函数:

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%的时间.(编辑:当我说它比其他代码快时,我指的是讨论中提供的其他代码.性能相当于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);
}

Java相关问答推荐

从技术上讲,OPC UA客户端是否可以通过转发代理将请求通过 tunel 发送到OPC UA服务器?

Apache POI:使用反射获取zoom 级别

JUnit—如何模拟局部变量对象方法调用

使用REST客户端和对象映射器从字符串反序列化Json

为什么Java编译器不区分不同类型的方法?

测试何时使用Mockito强制转换对象会导致ClassCastException

Java-动态绑定-问题-了解

如何在代码中将行呈现在矩形前面?

Kotlin Val是否提供了与Java最终版相同的可见性保证?

在Frege中,我如何将一个字符串安全地转换为一个可能的Int?

Lombok@Nonnull是否也对供应商有影响?

JNI:将代码打包成自包含的二进制文件

舰队运行配置Maven版本

Oj算法 MatrixR032从字符串、归一化和余弦相似度计算创建

从映射列表中检索所有键

循环不起作用只有第一个元素重复

无法使用Open WebStart Java 8运行jnlp

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

无法在Java中获取ElastiCache的AWS CloudWatch指标

如何使JOOQ渐变脚本不重新创建表未更改的类?