0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

UTF8String是如何编码的?

西西 来源:哲想软件 作者:cogitosoftware 2022-08-26 09:55 次阅读

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时添加有问题的填充。

编辑:黄飞

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

    关注

    9

    文章

    1131

    浏览量

    40676
  • 编码器
    +关注

    关注

    45

    文章

    3595

    浏览量

    134159

原文标题:OSS Nokalva:ASN.1问答时间(3)

文章出处:【微信号:哲想软件,微信公众号:哲想软件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    单片机也可以轻松玩转UTF-8码和TTF字体了

    要让智能设备支持各国不同的文字,首先得有支持全球文字的编码集,时下最出名的要数UTF-8码了。
    的头像 发表于 11-23 17:18 4217次阅读
    单片机也可以轻松玩转<b class='flag-5'>UTF-8</b>码和TTF字体了

    LABVIEW字符串转换为UTF-8编码字符串

    ,在这个库中就包含了上述函数。库的具体位置如下图所示:这个库中的许多VI都使用了一个内置函数“"文本至UTF-8转换”。该函数可以把LABVIEW字符串转换为UTF-8编码的字符串。简单转换程序如下图所示:
    发表于 06-06 15:16

    请教大神们,如何用labview创建一个UTF-8编码的文本文件啊?

    请教大神们,如何用labview创建一个UTF-8编码的文本文件啊?
    发表于 03-11 09:03

    怎么在MDB中将编码设置为UTF-8

    是否有一种方法将编码设置为MDB中的UTF-8。我在Ubuntu/PIC18/XC8编译器上运行我的测试代码,预处理失败了,在UTF-8中使用了一个无效的字节序列。一些外来字符的存在导
    发表于 10-25 16:51

    如何将文件编码更改为UTF-8

    HII正在对我的项目本地化,需要使用UTF-8编码的字符串。我有一切工作代码,但在编辑器中,字符串显示,如果编码的ANSI拉丁代码页。我了解到,在开始新项目时可以选择UTF-8
    发表于 07-03 10:30

    linux系统编码怎么修改成utf-8

    LANG="zh_CN.GBK" 修改为LANG="zh_CN.UTF-8".保存退出
    发表于 07-11 07:28

    VC++ 怎么改变文件的编码UTF-8

    da哥们,问一下:VC++ 怎么改变文件的编码UTF-8?谢谢。
    发表于 07-27 07:46

    如何将UTF-8转换为GBK编码

    概述我们在单片机开发中常会遇到需要将UTF-8转换为GBK编码的需求。在我们了解各种编码格式的情况下可知,UFT-8不能直接转成GBK,需中转成unicode再转换为gbk。而unic
    发表于 12-09 07:39

    RT-Thread Studio的GBK编码版本如何改为UTF-8

    2.2.1工作区显示 GBK 编码,如何改为 UTF-8 呢?操作【窗口】–> 【首选项】在【搜索框】中,可以输入【编码】,这样,找到 【常规】–> 【工作空间】【文本文件编码】,改
    发表于 05-20 10:05

    请问如何在TouchGFX的TextArea通配符中显示UTF-8文本?

    是“UTF-8”,所以这是文件编码。我尝试使用 UART 作为调试控制台,它可以毫无问题地输出 UTF-8 文本。我猜 TouchGFX 的 Unicode 函数不希望 char* 字符串是
    发表于 12-09 06:11

    UNICODE,GBK,UTF-8区别

    Unicode编码,简要解释UCS、UTF、BMP、BOM等名词。这是一篇程序员写给程序员的趣味读物
    发表于 03-28 10:28 2412次阅读

    ascii和utf8的区别_ASCII编码UTF-8的关系

    UTF-8是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码Unicod
    的头像 发表于 01-30 13:34 3w次阅读
    ascii和<b class='flag-5'>utf8</b>的区别_ASCII<b class='flag-5'>编码</b>与<b class='flag-5'>UTF-8</b>的关系

    MySQL中utf8utf8mb4有什么区别

    MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。
    的头像 发表于 04-12 19:21 1.3w次阅读

    单片机中UTF-8如何转换得到GBK编码

    概述 我们在单片机开发中常会遇到需要将UTF-8转换为GBK编码的需求。在我们了解各种编码格式的情况下可知,UFT-8不能直接转成GBK,需中转成unicode再转换为gbk。而un
    发表于 11-26 10:51 19次下载
    单片机中<b class='flag-5'>UTF-8</b>如何转换得到GBK<b class='flag-5'>编码</b>

    Python字符编码转换

    -*- coding:utf- 8 -*-utf_8_a = '我爱中国' gbk_a = utf_8_a. decode ( 'utf-8
    的头像 发表于 07-05 16:25 1058次阅读
    Python字符<b class='flag-5'>编码</b>转换