|
|
1
3
它当然不取决于实施。也就是说,如果不同的实现以不同的方式处理它,其中一个就是做得不正确。 如果使用不需要未知字段的解码器对未知字段进行解码,解码应该会失败。它不会跳过未知字段。 然而,有一种方法可以在已知其他字段之前就提供这些字段。它将使用扩展标记(“…”)。假设我们开发了各种版本的ASN。1.规格。让我们称它们为V1、V2、V3等等。V1是最初的规范,但我们在设计V1时了解到,我们可能需要在某个时候对其进行修改。允许这样,而不是像这样
我们将声明Z可以像这样扩展
扩展标记表示,在c之后,可能还有更多未知的字段。解码器应该将包含此类字段的消息视为有效消息,只要它们遵循c。解码器将无法解码它们,因为它不知道它们应该是什么,但它知道它们是允许的。 假设我们通过插入两个类似这样的新字段将V1更新为V2
在这种情况下,V1版本可以与V2版本互操作。V1编码器将不包括d或e,而V2编码器将包括它们。从解码器的角度来看,V1解码器将接受(但不解码)d和e,而V2解码器将解码d和e(如果找到)。所以V1解码器会同时接受V1和V2编码,无论何时发现d和e,都会忽略它们;V2解码器也会同时接受V1和V2编码,注意V1编码不包括d或e,但仍然有效。 我们可以通过其他版本继续这样做,例如,
其中V1、V2和V3都可以互操作。 然而,请注意,由于我们处理的是一个序列,因此必须保留顺序。没有d就不能有e,没有d,e和f就不能有g。 因此,结论是,如果类型定义包含扩展标记,则可以添加新字段,但如果不包含扩展标记,则不能添加新字段。 |
|
2
0
这一切都取决于规范和实现。简言之,这是无从得知的。这取决于实施情况。使用asn的任何给定协议/格式的一些规范。1将明确说明忽略未知元素,在这种情况下,解码不应失败。 但更常见的是,解码器会拒绝任何不严格符合ASN的输入。1.语法应该是解码。 |