Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将十六进制字符串转换为Java字符串?_Java_String_Hex - Fatal编程技术网

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

如何将十六进制字符串转换为Java字符串?,java,string,hex,Java,String,Hex,为了记录日志,我们将日志转换为字节数组,然后转换为十六进制字符串。我希望以Java字符串的形式将其返回,但我无法这样做 日志文件中的十六进制字符串类似于 fd00000aa8660b5b010006acdc0100000101000100010000 如何对其进行解码?首先读取数据,然后将其转换为字节数组: byte b = Byte.parseByte(str, 16); 然后使用String构造函数: new String(byte[] bytes) 或者,如果字符集不是系统默认

为了记录日志,我们将日志转换为字节数组,然后转换为十六进制字符串。我希望以Java字符串的形式将其返回,但我无法这样做

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

fd00000aa8660b5b010006acdc0100000101000100010000

如何对其进行解码?

首先读取数据,然后将其转换为字节数组:

 byte b = Byte.parseByte(str, 16); 
然后使用
String
构造函数:

new String(byte[] bytes) 
或者,如果字符集不是系统默认值,则:

new String(byte[] bytes, String charsetName) 
在Apache Commons中使用:

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

请尝试以下代码:

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();

}
公共静态字节[]解码(字符串十六进制){

String[]list=hex.split((?这是将十六进制字符串转换为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;
}
公共静态字符串unHex(字符串arg){
字符串str=“”;

对于(int i=0;i您可以从
字符串(十六进制)
字节数组
字符串作为UTF-8(?)
。确保您的十六进制字符串没有前导空格和其他内容



你应该开始将你的一些问题标记为已回答,这将帮助你获得更多答案。我投了你一票,因为没有展示任何先前的研究/努力。当然,它可能有效,也可能无效,这取决于“其他人”使用的编码“。可能他们使用了拉丁语9.或UTF-8.或EUC-JP.或者可能是大端的。谁知道呢?这就是为什么在转换为十六进制字符串之前,应该指定日志字符串使用的编码。使用
Byte.parseByte(str,16);
解析一个十六进制数。字符串构造函数需要一个字节数组,而不仅仅是字节,我尝试了,但失败了。@zundi在第一行中只解析一个字节。所以你需要使用一个循环来获取所有字节并将其放入数组。请看Munene iUwej Julius answer。他的方法就是这样做的。我将byte.parseByte改为(byte)Integer.parseInteger允许对大于128的数字进行分析。@domenukk它是Integer.parseInteger(..)不是Integer.parseInteger(..).Byte.parseByte实现如下{返回(字节)Integer.ParseIntent(Str,base);}@Munene thanx 4个正在创建的子字符串regexLots。不理想。用StringBuffer()替换“String Str”,并使用sb.append(char)如果性能是一个问题。如何对kitkat以下的版本执行ot?我可以问一下将其转换为UTF-8字符串的目的是什么吗?我在哪里找到
DatatypeConverter
?在最近的Java版本中不再公开了javax.xml.bind.DatatypeConverter编码值是什么?Hex现在是Apache Commons编码的一部分这里是dependency:
commons codec commons codec 1.12
不需要太多的识别,这些数据不是UTF-8编码的字符串,
新字符串(字节,“UTF-8”)
只会产生垃圾。
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;
}
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);