java charset解码将字符串转换为十六进制代码的问题

时间:2017-11-25 08:35:29

标签: java unicode byte

我读了一串字节,我想将其转换为十六进制代码。我知道一般数据是:

aa 01 00 1c 1e 38 5a 19 26 fc 00 7a e1 48 00 00 ff bf 00 58 01 2c 00 00 00 64 25 ff

我使用以下代码将字符串转换为十六进制:

 byte[] temp = record.value().getBytes();
                    StringBuffer result = new StringBuffer();
                    for (byte b : temp) {
                        result.append(String.format("%02X ", b));
                        result.append(" "); // delimiter
                    }
                    System.out.println(result);

,输出为:

EF BF BD 01 00 1C 1E 39 5A 18 40 EF BF BD 00 38 51 EF BF BD 00 00 EF BF BD EF BF BD 00 48 00 EF BF BD 00 00 00 64 EF BF BD 1F

问题是aa字节改为EF BF BD

所以我尝试使用如下的Unicodes:

byte[] temp = record.value().getBytes(StandardCharsets.ISO_8859_1);

byte[] temp = record.value().getBytes("windows-1252");

,输出变为:

3F 01 00 1C 1E 39 5A 18 40 3F 00 38 51 3F 00 00 3F 3F 00 48 00 3F 00 00 00 64 3F 1F

这次它将aa更改为3F

如何解决此问题并正确打印数据?

注意:在C ++中遇到同样的问题,将数据从char[]更改为unsigned char[]解决了这个问题。

2 个答案:

答案 0 :(得分:3)

没有"字节串" 它可以是字节数组(或列表),也可以是String。 在Java中,String表示UTF-16。字节没有编码。

EF BF BD是FFFD的UTF-8,它是Unicode替换字符(用于数据损坏,当字符无法转换为某个代码页时)。

因为你使用record.value()。getBytes()我假设record.value()是一个String。 你怎么看那个字符串?它从何而来? 这是一个真正的字符串,而不是字节。 aa 01 00 1c 1e 38 ...看起来不像字符串中的有效字节(至少不包含可读文本的字符串)。

你能做的最好的事情就是确保直接得到字节,而不是字符串和转换。这意味着早些时候某些字节被转换为字符串。而且(可能)已经损坏了它们。

答案 1 :(得分:0)

我尝试了你的代码并且工作正常:

public class T14ReadBytes {
    public static void main(String[] args) {
        byte[] temp = new byte[10];
        temp[0] = (byte) 0xaa;
        temp[1] = (byte) 0x01;
        temp[2] = (byte) 0x00;
        temp[3] = (byte) 0x1c;
        temp[4] = (byte) 0x1e;
        temp[5] = (byte) 0x38;
        temp[6] = (byte) 0x5a;
        temp[7] = (byte) 0x19;
        temp[8] = (byte) 0x26;
        temp[9] = (byte) 0xfc;

        StringBuffer result = new StringBuffer();
        for (byte b : temp) {
            result.append(String.format("%02X ", b));
        }
        System.out.println(result);
    }
}

结果是: AA 01 00 1C 1E 38 5A 19 26 FC