我读取了一串字节,我想将其转换为十六进制代码。我知道一般数据是:
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
问题是它aa用EF 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
这次变成aa了3F。
如何解决此问题并正确打印数据?
注意:在C++中遇到同样的问题,将数据从更改char[]为unsigned char[]解决了问题。
没有“字节串”它要么是一个字节数组(或列表),要么是一个字符串。在 Java 中,字符串表示 UTF-16。字节没有编码。
EF BF BD 是 FFFD 的 UTF-8,它是 Unicode 替换字符(用于数据损坏,当字符无法转换为某个代码页时)。
由于您使用 record.value().getBytes() 我假设 record.value() 是一个字符串。你怎么读那个字符串?它从何而来?那是一个真正的字符串,而不是字节。aa 01 00 1c 1e 38 ... 看起来不像字符串中的有效字节(至少不是包含可读文本的字符串)。
您能做的最好的事情是确保您直接获得字节,而不是字符串并进行转换。这意味着在更早的某个地方,一些字节被转换为字符串。这(可能)已经损坏了它们。
| 归档时间: |
|
| 查看次数: |
3807 次 |
| 最近记录: |