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

Soh*_*ani 4 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);
Run Code Online (Sandbox Code Playgroud)

输出是:

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

问题是它aaEF BF BD.

所以我尝试应用如下的 Unicode:

byte[] temp = record.value().getBytes(StandardCharsets.ISO_8859_1);
Run Code Online (Sandbox Code Playgroud)

或者

byte[] temp = record.value().getBytes("windows-1252");
Run Code Online (Sandbox Code Playgroud)

并且输出更改为:

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

这次变成aa3F

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

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

Mih*_*ita 5

没有“字节串”它要么是一个字节数组(或列表),要么是一个字符串。在 Java 中,字符串表示 UTF-16。字节没有编码。

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

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

您能做的最好的事情是确保您直接获得字节,而不是字符串并进行转换。这意味着在更早的某个地方,一些字节被转换为字符串。这(可能)已经损坏了它们。