UTF8String是如何编码的?

电子说

1.3w人已加入

描述

 1、在解码PER 编码的PDU 时,IA5String字符似乎被解码,就好像从它们的数值中减去了1。为什么?

这是编码器或解码器端ASN.1 语法中的拼写错误导致的常见错误。省略空格字符通常很容易。例如假设在编码器端 IA定义为:

IA::= IA5String (FROM ("0123456789No.*,"))

但在解码器方面:

IA::= IA5String (FROM ("0123456789No. *,")) <-- space ishere

带有一个额外的空格字符“”。这导致值

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 个字节,其值为110xxxxxx 10xxxxxx,其中x 是有效位,110中的11 表示字符长2 个字节。

如果字符的前4 位是1110,则表示该字符长3 个字节,其值为1110xxxx 10xxxxxx 10xxxxxx,其中x 是有效位,1110中的111 表示该字符长3 个字节。

如果一个字符的前5 位是11110,则表示该字符长4 个字节,其值为11110xxx 10xxxxxx 10xxxxxx10xxxxxx,其中X 是有效位,11110中的1111 表示该字符长4 个字节。

如果字符的前6 位是111110,则表示该字符长5 个字节,其值为111110xx 10xxxxxx 10xxxxxx10xxxxxx 10xxxxxx,其中X 是有效位,111110中的11111 表示该字符长5 个字节。

如果一个字符的前7 位是1111110,则表示该字符长6 个字节,其值为1111110x 10xxxxxx 10xxxxxx10xxxxxx 10xxxxxx 10xxxxxx,其中X 是有效位,1111110中的111111 表示该字符长6 个字节。

3、扩展加法的PER ALIGNED编码的起始位应该是八位字节对齐还是八位字节不对齐?

它应该作为八位字节未对齐的位字段添加。

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、为什么零填充出现在短约束受限字符串类型的PER ALIGNED 编码中?

让我们考虑一下:

N::= NumericString (SIZE(0..3))

nN ::= "27"

和:

N::= NumericString (SIZE(0..4))

nN ::= "27"

X.691(2008)的第30.5.7条说:

30.5.7如果“aub”不等于“alb”或大于或等于64K,则应调用11.9以添加前面的位字段通过一个长度行列式,其中 n作为字符串中字符的计数,长度行列式为“alb”,上限为“aub”。如果“aub”乘以“b”大于或等于16,则应将位字段添加为字段(对齐变体中的八位字节对齐),否则应添加为非八位字节的位字段对齐。这样就完成了本条的程序。

由于我们有SIZE(0..4),我们计算:

aub* b == 4 * 4 = 16

这使我们在上限大于3时添加有问题的填充。

编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分