`

BER编码规则

 
阅读更多

BER编码

一.基本规则

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

1.BER传输语法的格式一直是TLV三元组<Type,Length, Value>.

 

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来代替

 转载自http://blog.csdn.net/sever2012/article/details/7698297

 

  • 大小: 6 KB
  • 大小: 5.4 KB
分享到:
评论

相关推荐

    BER编码规则和传输语法

    BER编码规则和传输语法是通信领域中至关重要的概念,尤其在数据编码与解码过程中扮演着核心角色。BER,即Basic Encoding Rules,是Abstract Syntax Notation One (ASN.1)中最早定义的一套编码规则,它确保了抽象数据...

    ASN1 BER 编码规则和传输语法

    ### ASN1 BER编码规则详解 #### 一、BER编码规则概览 BER(Basic Encoding Rules)作为ASN.1(Abstract Syntax Notation One)标准中最早确立的编码规则,旨在为数据提供一种统一的序列化方法,确保不同系统间的...

    编码规则与传输语法(BER)

    BER 编码规则与传输语法 BER(Basic Encoding Rules)是 ASN.1 中最早定义的编码规则,它是基于正确的抽象描述上。BER 传输语法的格式一直是 TLV 三元组, Length, Value&gt;也可以认为是, Length, Value&gt;,其中每个域...

    基于ASN.1的 ber编码接口封装及实现

    总结起来,"基于ASN.1的Ber编码接口封装及实现"涉及到的主要知识点包括:ASN.1数据表示法、Ber编码规则、软件封装原理、日志记录在开发中的作用,以及如何处理和验证ASN.1数据报文。理解和掌握这些内容,对于开发...

    BER编码规则和传输语法[收集].pdf

    **BER编码规则和传输语法详解** 在软件开发中,数据编码和传输的规范至关重要,而BER(Basic Encoding Rules)就是ASN.1(Abstract Syntax Notation One)标准中定义的一种编码规则,用于序列化和反序列化ASN.1定义...

    asn.1的ber编码

    PER编码规则进一步优化了BER编码规则,提高了编码效率。在PER中,如果编码器和解码器已经知道某些信息(如标签、长度和值),则这些信息可以被省略。这使得PER编码更加紧凑和高效。 #### 三、示例分析 以`INTEGER...

    BERcodec vb 。net 实现的 ber编码类

    尽管BER编码较为灵活,但其结果通常比其他编码规则如DER(Distinguished Encoding Rules)更长,因为BER编码总是包含每个元素的完整长度信息,而DER则假设某些长度信息可以省略。 VB.NET是Microsoft开发的一种面向...

    asn1.rar_asn1_asn1 ber_ber编码

    2. BER编码规则: - 类型标识符:标识数据的类型。 - 长度字段:表示后续数据的长度,可以是短格式或长格式。 - 值字段:实际的数据内容,根据数据类型进行编码。 3. DER编码规则: - 对BER的约束,如长度字段...

    ASN.1 ber编码文件查看工具

    "ASN.1 BER编码文件查看工具"是一种专门用于解析和展示BER编码的ASN.1文件的软件。它允许用户深入了解BER编码的数据结构,揭示隐藏在16进制编码背后的逻辑和信息。通过这种工具,你可以看到每个元素的tag值,这是...

    ASN.1BER编解码系统与设计ASN.1编码规则详解(最全最经典).doc

    BER编码遵循一套逻辑规则,确保数据的正确解析。 **ASN.1的基本概念:** 1. **ASN.1词汇和词法约定**:ASN.1使用特定的字符集和词项来定义数据结构,如布尔类型、整数类型、枚举类型等。 - **布尔类型**:仅有的两...

    ASN.1-BER规则.pdf

    2. BER编码的原理和特点。 3. BER与其他编码规则(如DER、CER)的区别和应用场景。 4. 如何使用ASN.1和BER进行数据编码和解码。 5. ASN.1在通信协议和数据交换中的实际应用案例。 6. 可能会涉及的编码效率、可读性和...

    snmp网络管理 TLV BER编码相关

    SNMP报文格式分析及实现 SNMP应用系统中MIB编译器的实现 SNMP中ASN_1的基本编码规则 SNMP中基本编码规则的程序实现 基于SNMP的网管代码实现 简单网络管理协议分析仪的设计与实现 数据编码_解码的Java实现

    ASN.1 BER DER编码子集入门指南.pdf

    BER编码规则提供了灵活性,但也可能导致数据的不确定性和不一致性问题。 #### 可辨别编码规则(DER) DER是BER的一个子集,它提供了一种确定性的编码方式,确保对于每一个ASN.1值,只有一种唯一的DER编码。这种...

    ASN1 BER DER 编码子集入门指南.rar

    2. **BER编码原理**:解释BER编码规则,包括数据类型的编码方式、长度字段的处理以及如何构建实际的位流。 3. **DER编码规则**:深入讲解DER编码与BER的区别,以及为什么在需要唯一性的情况下选择DER。 4. **OpenSSL...

    ASN.1 BER DER编码

    每一个ASN.1值都可以有多种BER编码方式,但在实践中,通常会使用DER(可辨别编码规则),它保证了对每一个ASN.1值只有一种编码方式。 ASN.1中的基本数据类型包括整数(INTEGER)、布尔值(BOOLEAN)、比特串(BIT ...

    Go-asn1-golang的Asn.1BER和DER编码库

    2. **BER和DER编码**:在Asn.1中,BER是一种宽松的编码规则,允许在某些情况下有多种编码方式。DER则是BER的一个子集,是一种严格的、非二义性的编码规则,常用于X.509证书和其他需要唯一编码的形式。 3. **编码和...

    asn1-ber-syntax:BER编码的ASN.1数据的语法树,不了解模式

    然后,我们需要学习BER编码的规则,包括如何编码每个数据类型的值,以及如何处理构造类型中的嵌套和递归。 在Haskell中实现asn1-ber-syntax可能涉及以下步骤: 1. 定义ASN.1数据类型的Haskell表示。这通常涉及创建...

    ASN.1 BER DER编码子集入门指南

    1. **BER编码** 是ASN.1的基础编码规则,提供了最灵活的编码方法,但可能导致相同的数据有不同的编码形式。它允许编码过程中的某些自由度,例如长度字段可以前缀或后缀,这使得BER编码不那么紧凑,但对于未知长度的...

    基于BER的ASN.1语法编译器及编解码器实现与应用

    - **BER编码算法**:实现BER编码规则,确保数据正确编码。 - **优化策略**:采用内存管理和循环展开等技术,提高编解码速度。 #### 四、应用场景 在移动通信国际漫游话单处理系统中,基于BER的ASN.1语法编译器及编...

    asn1编码介绍

    BER编码规则较为宽松,适合于需要高灵活性的应用场景。 - **通用标签**:BER为每种通用标签指定了固定的编码格式。 - **构造标签**:对于构造类型,BER编码还包含类型标签以及内部元素的长度信息。 - **内容编码**...

Global site tag (gtag.js) - Google Analytics