热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ASN.1笔记——标准编码规则BER

BER编码一.基本规则BER(BasicEncodingRules)是ASN.1中最早定义的编码规则,其他编码规则是在BER的基础上添加新的规则构成。1.BER传输语法的格式一直是TL


BER编码

一.基本规则

BERBasicEncoding Rules)是ASN.1中最早定义的编码规则,其他编码规则是在BER的基础上添加新的规则构成。

1.BER传输语法的格式一直是TLV三元组.

TTagL是整个类型的长度,V是类型的Value,它还可以是TLVTLV组合

2.BER传输语法是基于八位组大端编码的,高八位在左。

3.Tag是一个或若干个八位组

(1).UniversalTag类型(值是0-30):


第七、六位指明Tag的类型,UniversalTag类型用00表示;第五位指明该类型以primitive方式编码还是constructed方式编码。

Tagvalue值是基本类型的Tag的值,例如INTEGERTag值是2,SEQUENCE型类Tag值是16:

ASN.1中定义的UNIVERSALTag

Tag

类型

0

BER保留

1

BOOLEAN

2

INTEGER

3

BIT STRING

4

OCTET STRING

5

NULL

6

OBJECT IDENTIFIER

7

ObjectDescripion

8

EXTERNAL,INSTANCE OF

9

REAL

10

ENUMERATED

11

EMBEDDED PDV

12

UFT8String

13

RELATIVE-OID

14

保留

15

保留

16

SEQUENCE,SEQUENCE OF

17

SET,SET OF

18

NumericString

19

PrintableString

20

TeletexString,T61String

21

VideotexString

22

IA5String

23

UTCTime

24

GeneralizedTime

25

GraphicString

26

VisibleString,ISO646String

27

GeneralString

28

UniversalString

29

CHARACTER STRING

30

BMPString

31

保留



(2).Tag大于30时,多个八位组中编码,第一个八位组后五位全部为1,其余的八位组最高位为1表示后续还有,为0表示Tag结束。


第一个八位组高二位的取值:00表示Universal01表示APPLICATION类型,10表示context-specific,11表示PRIVATE类型

2.BER编码中Length表示Value部分所占八位组的个数,有两大类:定长方式(DefiniteForm)和不定长方式(IndefiniteForm

(1).定长方式

定长方式中,按长度是否超过一个八位,又分为短、长两种形式

短:类型长度大于等于0个八位,小于等于127

长:类型长度大于等于127个八位,小于等于256^126-1


第一个八位组的低七位指明整个L所占用的八位组个数,后续八位组表示V的长度

(2).不定长方式

Length所在八位组固定编码为0x80,但在Value编码结束后以两个0x00结尾。这种方式使得可以在编码没有完全结束的情况下,可以先发送部分消息给对方。


.各类型的编码

UNIVERSALTag和短型Value为例,讨论各种类型的BER编码,重点关注Value部分。

1.BOOLEAN

只能以primitive方式编码,FALSE的编码为(n10表示10进制):


TRUE的编码(任何不是全0都可以)为:


或者:


2.NULL

只能以primitive方式编码,且只有一个值:


3.INTEGER

只能以primitive方式编码。

(1).对于正数,如果最高比特位为0则直接编码;如果为1,则在最高比特位之前增加一个全0的八位组。

最高位为0:

最高位为1:

(2).对于负数,先取绝对值,再取反,最后加1

4.ENUMERATED

按照整数值的规则编码。

5.REAL

(1).0


(2).正无穷大:


(3).
负无穷大:


(4).基于10进制且以10为底的指数方法:


NR有三个可选值:

NR1:在V中底6位用000001表示,表示不带小数和指数的简单10进制整数。

例如4902,#4902,##4902,+4902等,#表示空格,每个字符占一个8位组。

NR2:在V中底6位用000010表示,表示还小数点的10进制数

例如4902.00,#4902.0,1.0

NR3:在V中底6位用000011表示,在NR2的基础上扩展,用字符‘E’代表以10为底的指数

例如+0.56.0E2,0.2E-3

实数的表示方法在ISO6093标准文档中做了详细定义。

(5).基于2进制的编码方式

这种方式比较奇怪,先放一边

6.BIT STRING

可以primitive方式编码或者constructed方式编码。

(1).Primitive方式:

例如'1011011101011'B的编码


V中第一个八位取值0-7,表示在这个V后面补的0的个数

如果BITSTRING的值为空,则编码时,长度为1,补充的八位组为全0。


(2).constructed方式

'1011011101011'B的编码


L的最高位是1,说明是不定长方式编码,V中嵌套两个TLV,Primitive方式表示这个值的高八位和低八位,最后以两个全为0的八位结尾

7.OCTET STRING

BITSTRING类似,但是不需要增加表征补充位个数的八位组。

8.OBJECT IDENTIFIER

只能以primitive方式编码。编码时,第一个八位组采用公式:first_arc* 40+second_arc如果一个数大于127,就采用多个8位表示,最高位用1表示后续还有octet,0表示后续没有。

例:对{isomember-body f(250) type-org(1) ft(16) asn1-book(9)}的编码为


注意对250的编码方式,1×128+122

9.RELATIVE-OID

OBJECTIDENTIFIER类似,但是不需要对注册树前两段进行特殊处理。


10.字符串和日期

OCTETSTRING编码类似,只是Tag不同。

11.SEQUENCE只能用constructed形式。对每个成员均以TLV方式编码,且顺序要与定义的一致。

v SEQUENCE { age INTEGER, single BOOLEAN } ::={age 24, single TRUE }的编码为:


注意BOOLEAN类型,非0表示真。

忽略扩展符'...',对扩展的内容则按顺序编码。

12.SET

SEQUENCE类似,但是成员顺序有发送者决定。

13.SEQUENCEOF

SEQUENCEOfTagSEQUENCE相同,编码规则也相同。

14.SETOF

SEQUENCEOf类似。

15.CHOICE

严格说CHOICE类型在编码中并不存在,只是在描述中体现一种关系。编码时,是按照具体被选择的成员编码规则编码的。

例如amousCHOICE { name VisibleString, nobody NULL } ::= name:"Perec"

的编码为:


Tag26,上选定成员的类型的tag

如果CHOICE类型显式(EXPLICIT)指定了Tag,那么该Tag应当以constructed方式编码。

忽略扩展符'...',对扩展的内容则按顺序编码。

16.Tag对编码的影响

(1).如果Tag是隐式的,或者在模块定义中声明了IMPLICITTAGS或者AUTOMATICTAGS,则只有关键字IMPLICIT左侧的Tag才会被编码。如:

v [1]IMPLICIT INTEGER ::= -38的编码为:


(2).如果一个类型的Tag是显式(EXPLICIT)的(或者在模块定义中声明了EXPLICITTAGS),则要以constructed方式编码三元组系列。

如v[APPLICATION 0] EXPLICIT INTEGER ::= 38的编码为:


17.子类型约束

子类型约束是在BER编码规则之后被引入ASN.1的,在编码规则中不能体现约束。

18.EXTERNAL

该类型不推荐使用,略。

19.INSTANCEOF

定义为:

vINSTANCE OF TYPE-IDENTIFIER ::=

{

type-id{iso member-body f(250) type-org(1) ft(16) asn1-book(9)

chapter18(5)integer- type(0)},


valueINTEGER:5

}

的编码应当和如下一个SEQUENCE类型的值类似:

{

direct-reference{iso member-body f(250) type-org(1) ft(16) asn1-book(9)

chapter18(5)integer-type(0)},

encodingsingle-ASN1-type:INTEGER:5

}

编码为:


为什么valueINTEGER:5的编码采用constructed方式,处层TLVTag为上下文类型,值为0

20.EMBEDDEDPDV

EMBEDDEDPDV的编码和其等效的SEQUENCE结构编码类似。其嵌入部分的编码,应该是遵循identification成员指定的规则。

21.CHARACTERSTRING

CHARACTERSTRING的编码和其等效的SEQUENCE结构编码类似。其嵌入字符串部分的编码,应该是遵循identification成员指定的规则。

22.InformationObjects and Object Sets

信息对象和对象集合永远都不编码。如前所述,传递他们所包含信息的途径是在值定义或者类型定义中引用他们。这样的结果,不是在编码中出现了这些信息,而是ASN.1编译器在生成编解码器时,会按照这些信息生成相应的约束表。

23.ValueSet

值集合的编码按照对应类型的编码规则进行。

.BER编码规则的属性

1.BER编码规则是机器无关

2.BER的传输语法是十分冗长。,TL很多情况下都是可以省略,但是这种冗余信息能很好的保藏抽象语法结构。

3.BER传输语法能容易升级而且向上兼容。如每个类型都可以用CHOICE来代替



推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
author-avatar
qaz9
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有