1、在解码PER编码的PDU时,IA5String字符似乎被解码,就好像从它们的数值中减去了1。为什么?
这是编码器或解码器端ASN.1语法中的拼写错误导致的常见错误。省略空格字符通常很容易。例如假设在编码器端IA定义为:
IA::=IA5String(FROM("0123456789No.*,"))
但在解码器方面:
IA::=IA5String(FROM("0123456789No.*,"))<--spaceishere
带有一个额外的空格字符“”。这导致值
aIA::="1234"
在PER中被解码为“2345”而不是“1234”。PER中允许的字母表在值的编码/解码方式中起着至关重要的作用。
2、你能解释一下UTF8String以及它是如何编码的吗?
UniversalString和UTF8String都支持完全相同的字符集,前64K字符都是BMPString中的字符集。请注意,BMPString的前128个字符与IA5String是同一组抽象字符(我们使用术语“抽象”来指出它们实际上是相同的,但它们的编码不同),并且由于BMPString是UniversalString和UTF8String意味着IA5String是这些字符串类型的前128个抽象字符。
好的,既然我们知道UTF8String不是由BMPString和UniversalString字符组成,而只是对与BMPString和UniversalString编码的字符集完全相同的一组字符进行编码的不同方式,那么让我们来谈谈它实际上是如何编码的。
简而言之,如果一个字符的第一个字节的第一位是0,则意味着这个字符是一个字节长,如果你看一下字符映射你会看到这组字符(其中有128个,自然)是美国ASCII(即IA5String)。
如果字符的前3位是110,则表示该字符长2个字节,其值为110xxxxxx10xxxxxx,其中x是有效位,110中的11表示字符长2个字节。
如果字符的前4位是1110,则表示该字符长3个字节,其值为1110xxxx10xxxxxx10xxxxxx,其中x是有效位,1110中的111表示该字符长3个字节。
如果一个字符的前5位是11110,则表示该字符长4个字节,其值为11110xxx10xxxxxx10xxxxxx10xxxxxx,其中X是有效位,11110中的1111表示该字符长4个字节。
如果字符的前6位是111110,则表示该字符长5个字节,其值为111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxx,其中X是有效位,111110中的11111表示该字符长5个字节。
如果一个字符的前7位是1111110,则表示该字符长6个字节,其值为1111110x10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx,其中X是有效位,1111110中的111111表示该字符长6个字节。
3、扩展加法的PERALIGNED编码的起始位应该是八位字节对齐还是八位字节不对齐?
它应该作为八位字节未对齐的位字段添加。
X.691(2008)的第19.7和19.8节说,扩展添加的编码从位掩码开始,该位掩码的位指示特定扩展的存在。反过来,位掩码以它的长度为前缀,根据19.8,它被编码为“通常较小的长度”。
X.691(2008)的第11.9.3.4节规定,“通常较小的长度”的编码从一个0或1的单个位位字段开始(如果扩展的数量<=64和1,则为0除此以外)。
术语“位域”在X.691(2008)的第3.7.3节中进行了解释,随后是澄清说明:
注意:如果使用该术语后跟“对齐变体中的八位字节对齐”,这意味着在PER对齐变体的完整编码中,位字段需要从八位字节边界开始。
由于X.691(2008)的第11.9.3.4节没有明确提到单个位字段是八位字节对齐的,这意味着不需要八位字节边界上的对齐。
请参阅X.691(2008)的第11.1.4节,了解如何在构建完整编码时使用位域,而不是如何使用八位字节对齐的位域。
4、有没有办法跳过解码BER中的SET/SEQUENCE中的一些不需要的字段?
是的,您可以这样做,但只能在BER/DER/CER中,而不是在PER/UPER中,因为PER的性质。考虑BER/DER/CER中的以下ASN.1语法:
基于上述语法,您可以对S1PDU进行编码,但使用S2PDU对其进行解码,其类型利用ASN.1可扩展性。第一个“...”标志着扩展的开始,第二个标志着它的结束。第二个“...”之后的字段d继续扩展根。在BER/DER/CER中,解码器将简单地跳过两个扩展标记之间的所有字段并继续使用字段d进行解码。
5、为什么零填充出现在短约束受限字符串类型的PERALIGNED编码中?
让我们考虑一下:
N::=NumericString(SIZE(0..3))
nN::="27"
和:
N::=NumericString(SIZE(0..4))
X.691(2008)的第30.5.7条说:
30.5.7如果“aub”不等于“alb”或大于或等于64K,则应调用11.9以添加前面的位字段通过一个长度行列式,其中n作为字符串中字符的计数,长度行列式为“alb”,上限为“aub”。如果“aub”乘以“b”大于或等于16,则应将位字段添加为字段(对齐变体中的八位字节对齐),否则应添加为非八位字节的位字段对齐。这样就完成了本条的程序。