如何将十六进制字符串转换为 Java 字符串?

Posted

技术标签:

【中文标题】如何将十六进制字符串转换为 Java 字符串?【英文标题】:How to convert hex string to Java string? 【发布时间】:2012-12-09 01:56:47 【问题描述】:

出于日志记录的目的,我们将日志转换为字节数组,然后转换为十六进制字符串。我想用 Java 字符串取回它,但我做不到。

日志文件中的十六进制字符串类似于

fd00000aa8660b5b010006acdc0100000101000100010000

我该如何解码?

【问题讨论】:

您应该开始将您的一些问题标记为已回答,这将帮助您获得更多答案。 由于没有展示任何先前的研究/努力,我给了你一票。 【参考方案1】:

在 Apache Commons 中使用 Hex

String hexString = "fd00000aa8660b5b010006acdc0100000101000100010000";    
byte[] bytes = Hex.decodeHex(hexString.toCharArray());
System.out.println(new String(bytes, "UTF-8"));

【讨论】:

Hex 现在是 Apache Commons Codec 的一部分 这里的依赖:<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.12</version> </dependency> 不需要太多识别,这个数据不是 UTF-8 编码的字符串,new String(bytes, "UTF-8") 只会产生垃圾。【参考方案2】:
byte[] bytes = javax.xml.bind.DatatypeConverter.parseHexBinary(hexString);
String result= new String(bytes, encoding);

【讨论】:

我在哪里可以找到DatatypeConverter 在最近的 Java 版本中不再公开 javax.xml.bind.DatatypeConverter 编码值是多少? docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html【参考方案3】:

您可以从String (hex) 转到byte array 再到String as UTF-8(?)确保你的十六进制字符串没有前导空格和东西

public static byte[] hexStringToByteArray(String hex) 
    int l = hex.length();
    byte[] data = new byte[l / 2];
    for (int i = 0; i < l; i += 2) 
        data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                + Character.digit(hex.charAt(i + 1), 16));
    
    return data;

用法:

String b = "0xfd00000aa8660b5b010006acdc0100000101000100010000";
byte[] bytes = hexStringToByteArray(b);
String st = new String(bytes, StandardCharsets.UTF_8);
System.out.println(st);

【讨论】:

kitkat以下版本怎么办? 请问转成String为UTF-8的目的是什么?【参考方案4】:

先读入数据,再转成字节数组:

 byte b = Byte.parseByte(str, 16); 

然后使用String构造函数:

new String(byte[] bytes) 

或者如果字符集不是系统默认的则:

new String(byte[] bytes, String charsetName) 

【讨论】:

当然,它可能会也可能不会取决于“其他人”使用的编码。也许他们使用了拉丁语 9。或 UTF-8。或 EUC-JP。或者它可能是在 Big-Endian 中。谁知道? 这就是为什么你应该在转换为十六进制字符串之前指定日志字符串使用的编码。 使用Byte.parseByte(str, 16);解析一个十六进制数。 String 构造函数需要一个字节数组,而不仅仅是字节,我试过但失败了。 @zundi 在第一行你只解析一个字节。因此,您需要使用循环来获取所有字节并将它们放入数组中。请看 Munene iUwej Julius 的回答。他的方法就是这样做【参考方案5】:

试试下面的代码:

public static byte[] decode(String hex)

        String[] list=hex.split("(?<=\\G.2)");
        ByteBuffer buffer= ByteBuffer.allocate(list.length);
        System.out.println(list.length);
        for(String str: list)
            buffer.put(Byte.parseByte(str,16));

        return buffer.array();


要转换为字符串,只需使用解码方法返回的 byte[] 创建一个新字符串。

【讨论】:

我将 Byte.parseByte 更改为 (byte)Integer.parseInteger 以允许解析大于 128 的数字。 @domenukk 它是 Integer.parseInt(..) 而不是 Integer.parseInteger(..) 。 Byte.parseByte 实现如下 return (byte) Integer.parseInt(Str, base); @Munene thanx 4 正则表达式【参考方案6】:

将十六进制字符串转换为 java 字符串的另一种方法:

public static String unHex(String arg)         

    String str = "";
    for(int i=0;i<arg.length();i+=2)
    
        String s = arg.substring(i, (i + 2));
        int decimal = Integer.parseInt(s, 16);
        str = str + (char) decimal;
           
    return str;

【讨论】:

正在创建大量子字符串。不理想。 用 StringBuffer() 替换“String str”,如果性能有问题,请使用 sb.append(char)。

以上是关于如何将十六进制字符串转换为 Java 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中,如何将字节数组转换为十六进制数字字符串,同时保持前导零? [复制]

如何在Java中将字符从字母字符转换为十六进制数字?

如何将Mac地址转换为十六进制并将其传递给java中的字节数组

将十六进制字符串转换为 IP 地址

将 RGB 颜色值转换为十六进制字符串

Java:将二进制字符串转换为十六进制字符串[重复]