为了记录日志,我们将日志转换为字节数组,然后再转换为十六进制字符串。我想把它转换回Java字符串,但我无法做到。
日志文件中的十六进制字符串看起来像:
fd00000aa8660b5b010006acdc0100000101000100010000
我该如何解码这个?
使用Hex
:
String hexString = "fd00000aa8660b5b010006acdc0100000101000100010000";
byte[] bytes = Hex.decodeHex(hexString.toCharArray());
System.out.println(new String(bytes, "UTF-8"));
byte[] bytes = javax.xml.bind.DatatypeConverter.parseHexBinary(hexString);
String result= new String(bytes, encoding);
DatatypeConverter
? - zundi您可以从字符串(十六进制)
转换为字节数组
,再转换为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);
首先读取数据,然后将其转换为字节数组:
byte b = Byte.parseByte(str, 16);
接着使用 String
构造函数:
new String(byte[] bytes)
或者如果字符集不是系统默认的:
new String(byte[] bytes, String charsetName)
Byte.parseByte(str, 16);
来解析十六进制数。 - gogognomebytes
字节数组? - zundi
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();
}
如果使用JDK17或以上的版本,还有一种方法可以实现这一功能,请参阅新的HexFormat类,该类具有用于将byte[]
和十六进制String
相互转换的有用方法:
String hexStr ="5468697320697320616e206578616d706c6520737472696e67";
byte[] bytes = HexFormat.of().parseHex(hexStr);
String str = new String(bytes, StandardCharsets.UTF_8 /* or Charset.forName("whateverencoding")*/);
当然,您需要知道十六进制表示的精确字符编码,才能生成正确的 String
值。
将十六进制字符串转换为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;
}
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.12</version> </dependency>
- Jacques Koortsnew String(bytes, "UTF-8")
将只会产生垃圾数据。 - Holger