0

我正在处理一个二进制文件。在这个二进制文件中,我可以提取似乎是 UTF-16 XML(小端序)文件的内容。

如果我提取数据,并尝试从控制台转储它(运行 debian/jessie amd64),这就是我得到的:

$ xmllint --format D5905822-DFF9-7944-9CFE-258264B8162E.UNK
D5905822-DFF9-7944-9CFE-258264B8162E.UNK:1: parser error : Char 0x0 out of allowed range
<
 ^
D5905822-DFF9-7944-9CFE-258264B8162E.UNK:1: parser error : StartTag: invalid element name
<
 ^

我从 xmllint 的手册页中找不到任何帮助我的东西,所以我从网上下载了一个 UTF-16 Little endian 文件,从这里。我删除了实际的 XML 数据,只保留第一行(编码):

$ cat header
��<?xml version="1.0" encoding="UTF-16"?>

$ hexdump header
0000000 feff 003c 003f 0078 006d 006c 0020 0076
0000010 0065 0072 0073 0069 006f 006e 003d 0022
0000020 0031 002e 0030 0022 0020 0065 006e 0063
0000030 006f 0064 0069 006e 0067 003d 0022 0055
0000040 0054 0046 002d 0031 0036 0022 003f 003e
0000050 000d 000a                              
0000054

现在我可以正确使用 xmlling 了:

$ cat header D5905822-DFF9-7944-9CFE-258264B8162E.UNK > bla.xml
$ xmllint --format bla.xml
��<?xml version="1.0" encoding="UTF-16"?>
<InteractiveMeasurement>
  <InteractiveMeasurementRecord ElementUniqueName="f0c9b1c6-9a5c-40cd-8303-e507bb539cdc" IsValid="true">
[...]

没有其他更简单的解决方案吗?为什么读取 UTF-16 Little-endian XML 文件如此复杂?

4

1 回答 1

1

Gnome Encodings 支持的 XML C 解析器和工具包表明这种行为是设计使然,作者质疑为什么有人会想要其他东西。XMLLint 为输出编码提供了一个参数,但对输入没有这样做。

看起来可以使用进一步的编码来扩展解析器,但这可能不会超过默认的启发式。

于 2015-02-08T21:57:44.333 回答