我现在正在处理EXI。
没有很好的通用工具来处理 EXI。一旦您深入了解 EXI,您就会意识到二进制流中有一堆不必要的分隔符,这些分隔符对于模式来说是绝对和完全不需要的。其中一些是幽默的。
如果指定了两个值,您认为以下内容将如何在 EXI 中编码?
<xs:complexType name="example">
<xs:sequence>
<xs:element name="bool1" type="xs:boolean" minOccurs="0" />
<xs:element name="bool2" type="xs:boolean" minOccurs="0" />
</xs:sequence>
</xs:complexType>
您认为它可能最多为 4 位吗?1 位表示是否定义了 bool1,并且表示 bool1 的值,然后是另一个位表示是否定义了 bool2,那么 bool2 的值?
天哪,不!
好吧,让我告诉你男孩和女孩!这就是它的实际编码方式
+---- A value of 0 means this element (bool1) is not specified,
| 1 indicates it is specified
|+--- A value of x means this element is undefined,
|| 0 means the bool is set to false, 1 is set to true
||+-- A value of 0 means this element (bool2) is not specified,
||| 1 indicates it is specified
|||+- A value of x means this element is undefined
|||| 0 means the bool is set to false, 1 is set to true
||||
0x0x 4 0100 # neither bools are specified
0x10 8 00100000 # bool1 is not specified, bool2 is set to false
0x11 8 00101000 # bool1 is not specified, bool2 is set to true
100x 9 000000010 # bool1 is set to false, bool2 is not specified
110x 9 000010010 # bool1 is set to true, bool2 is not specified
1010 13 0000000000000 # bool1 is set to false, bool2 is set to false
1011 13 0000000001000 # bool1 is set to false, bool2 is set to true
1110 13 0000100000000 # bool1 is set to true, bool2 is set to false
1111 13 0000100001000 # bool1 is set to true, bool2 is set to true
^ ^
+-encoding--+
Which can be represented with this tree
0-0-0-0-0-0-0-0-0-0-0-0-0 (1010)
\ \ \ \ \
| | | | 1-0-0-0 (1011)
| | | |
| | | 1-0 (100x)
| | |
| | 1-0-0-0-0-0-0-0-0 (1110)
| | \ \
| | | 1-0-0-0 (1111)
| | |
| | 1-0 (110x)
| |
| 1-0-0-0-0-0 (0x10)
| \
| 1-0-0-0 (0x11)
|
1-0-0 (0x0x)
最少 4 位,MINIMUM 是为了不定义任何一个。现在我有点不公平,因为我包含了分隔符——完全没有必要的分隔符。
我现在明白这是如何工作的了。这是规格:
https://www.w3.org/TR/exi/
祝你阅读愉快!这对我来说很有趣!!!!@@##!@
现在这只是一个模式,EXI 规范特别指出您仍然可以对不符合模式的 XML 进行编码。这很有趣,因为这应该适用于小型 Web 设备。您如何处理无法在嵌入式设备中处理的意外数据?
为什么,你当然会死。对于您不期望的事情,无法恢复。这些东西不是有屏幕的,能通过串口登录就已经很幸运了。
我使用了 4 个不同的 XSD 生成器/解析器/XML 生成器。其中 3 个被我必须使用的 Schema 卡住了。C 和 C++ 的数据封送处理(请记住,这是针对内存和 CPU 资源很少的嵌入式系统)非常糟糕。
XSD 基本上描述了一种结构或类体系结构,我找不到一个工具可以只创建类。我上面给出的 XSD 示例应该创建一个具有 4 个布尔值的结构,2 个布尔值是值,2 个布尔值表示它们是否已定义。
但那存在吗?好吧,不。
我喜欢 XML,用于描述文档。我真的这样做了——但这就是我讨厌 XML 的地方——对于一个被广泛采用的标准,可用的工具绝对是糟糕的。当架构分布在多个命名空间和文档中时,仅读取架构是一件困难的事情。
吐槽吐槽
我们使用它的唯一原因是某些标准委员会坚持使用它。它所做的是为一小部分已经实施这一点的公司创造了垄断地位,这是唯一的目的。
EXI 不是一个被广泛采用的标准,XML 是一个糟糕的数字数据封装器,实现它很痛苦,而且没有合适的工具。EXIP 的版本是 5.0 - 任何开源的东西都是 Java 的 - 至少我有。
对于我的工作领域,EXI 只是一个糟糕的设计决策。我在各种嵌入式系统上研究了大量的通信协议。我在 DOCSIS 工作,所有现代有线调制解调器都使用它——它们使用简单且可扩展的类型/长度/值协议,并提供处理无法识别的类型的规定——这就是为什么总是包含长度的原因。这很简单,实现整个堆栈实际上需要几天时间。
EXI 很难编写代码,没有像样的处理器,最糟糕的是,我发现的所有处理器都可以很好地使用它,只需从 EXI<->XML 转换它——这完全没用。
我已经求助于编写自己的 XSD 解析器,这意味着我必须至少了解该设计中使用它的那些部分的整个 XML 规范——而且范围很广。任何合理的规格都需要我 2 周的时间,我花了 10 年。我的世界上没有人会使用它,除非它被塞进他们的喉咙而且他们不应该,它是一个圆孔的方形钉。