BER编码
一.基本规则
BER(BasicEncoding Rules)是ASN.1中最早定义的编码规则,其他编码规则是在BER的基础上添加新的规则构成。
1.BER传输语法的格式一直是TLV三元组<Type,Length, Value>.
T是Tag,L是整个类型的长度,V是类型的Value,它还可以是TLV或TLV组合
2.BER传输语法是基于八位组大端编码的,高八位在左。
3.Tag是一个或若干个八位组
(1).UniversalTag类型(值是0-30):
第七、六位指明Tag的类型,UniversalTag类型用00表示;第五位指明该类型以primitive方式编码还是constructed方式编码。
Tagvalue值是基本类型的Tag的值,例如INTEGER的Tag值是2,SEQUENCE型类Tag值是16:
ASN.1中定义的UNIVERSAL类Tag
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表示Universal,01表示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
SEQUENCEOf的Tag与SEQUENCE相同,编码规则也相同。
14.SETOF
与SEQUENCEOf类似。
15.CHOICE
严格说CHOICE类型在编码中并不存在,只是在描述中体现一种关系。编码时,是按照具体被选择的成员编码规则编码的。
例如amousCHOICE { name VisibleString, nobody NULL } ::= name:"Perec"
的编码为:
Tag为26,上选定成员的类型的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方式,处层TLV的Tag为上下文类型,值为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的传输语法是十分冗长。,T和L很多情况下都是可以省略,但是这种冗余信息能很好的保藏抽象语法结构。
3.BER传输语法能容易升级而且向上兼容。如每个类型都可以用CHOICE来代替
转载自http://blog.csdn.net/sever2012/article/details/7698297
相关推荐
BER编码规则和传输语法是通信领域中至关重要的概念,尤其在数据编码与解码过程中扮演着核心角色。BER,即Basic Encoding Rules,是Abstract Syntax Notation One (ASN.1)中最早定义的一套编码规则,它确保了抽象数据...
### ASN1 BER编码规则详解 #### 一、BER编码规则概览 BER(Basic Encoding Rules)作为ASN.1(Abstract Syntax Notation One)标准中最早确立的编码规则,旨在为数据提供一种统一的序列化方法,确保不同系统间的...
BER 编码规则与传输语法 BER(Basic Encoding Rules)是 ASN.1 中最早定义的编码规则,它是基于正确的抽象描述上。BER 传输语法的格式一直是 TLV 三元组, Length, Value>也可以认为是, Length, Value>,其中每个域...
总结起来,"基于ASN.1的Ber编码接口封装及实现"涉及到的主要知识点包括:ASN.1数据表示法、Ber编码规则、软件封装原理、日志记录在开发中的作用,以及如何处理和验证ASN.1数据报文。理解和掌握这些内容,对于开发...
**BER编码规则和传输语法详解** 在软件开发中,数据编码和传输的规范至关重要,而BER(Basic Encoding Rules)就是ASN.1(Abstract Syntax Notation One)标准中定义的一种编码规则,用于序列化和反序列化ASN.1定义...
PER编码规则进一步优化了BER编码规则,提高了编码效率。在PER中,如果编码器和解码器已经知道某些信息(如标签、长度和值),则这些信息可以被省略。这使得PER编码更加紧凑和高效。 #### 三、示例分析 以`INTEGER...
尽管BER编码较为灵活,但其结果通常比其他编码规则如DER(Distinguished Encoding Rules)更长,因为BER编码总是包含每个元素的完整长度信息,而DER则假设某些长度信息可以省略。 VB.NET是Microsoft开发的一种面向...
2. BER编码规则: - 类型标识符:标识数据的类型。 - 长度字段:表示后续数据的长度,可以是短格式或长格式。 - 值字段:实际的数据内容,根据数据类型进行编码。 3. DER编码规则: - 对BER的约束,如长度字段...
"ASN.1 BER编码文件查看工具"是一种专门用于解析和展示BER编码的ASN.1文件的软件。它允许用户深入了解BER编码的数据结构,揭示隐藏在16进制编码背后的逻辑和信息。通过这种工具,你可以看到每个元素的tag值,这是...
BER编码遵循一套逻辑规则,确保数据的正确解析。 **ASN.1的基本概念:** 1. **ASN.1词汇和词法约定**:ASN.1使用特定的字符集和词项来定义数据结构,如布尔类型、整数类型、枚举类型等。 - **布尔类型**:仅有的两...
2. BER编码的原理和特点。 3. BER与其他编码规则(如DER、CER)的区别和应用场景。 4. 如何使用ASN.1和BER进行数据编码和解码。 5. ASN.1在通信协议和数据交换中的实际应用案例。 6. 可能会涉及的编码效率、可读性和...
SNMP报文格式分析及实现 SNMP应用系统中MIB编译器的实现 SNMP中ASN_1的基本编码规则 SNMP中基本编码规则的程序实现 基于SNMP的网管代码实现 简单网络管理协议分析仪的设计与实现 数据编码_解码的Java实现
BER编码规则提供了灵活性,但也可能导致数据的不确定性和不一致性问题。 #### 可辨别编码规则(DER) DER是BER的一个子集,它提供了一种确定性的编码方式,确保对于每一个ASN.1值,只有一种唯一的DER编码。这种...
2. **BER编码原理**:解释BER编码规则,包括数据类型的编码方式、长度字段的处理以及如何构建实际的位流。 3. **DER编码规则**:深入讲解DER编码与BER的区别,以及为什么在需要唯一性的情况下选择DER。 4. **OpenSSL...
每一个ASN.1值都可以有多种BER编码方式,但在实践中,通常会使用DER(可辨别编码规则),它保证了对每一个ASN.1值只有一种编码方式。 ASN.1中的基本数据类型包括整数(INTEGER)、布尔值(BOOLEAN)、比特串(BIT ...
Ber编码遵循一套固定的规则,能够表示Asn.1中的所有数据类型,包括整数、字符串、序列、选择等。 另一方面,PER(Packed Encoding Rules)是Asn.1编码规则中的一种优化形式,旨在减少编码后的数据量,特别适合于...
2. **BER和DER编码**:在Asn.1中,BER是一种宽松的编码规则,允许在某些情况下有多种编码方式。DER则是BER的一个子集,是一种严格的、非二义性的编码规则,常用于X.509证书和其他需要唯一编码的形式。 3. **编码和...
然后,我们需要学习BER编码的规则,包括如何编码每个数据类型的值,以及如何处理构造类型中的嵌套和递归。 在Haskell中实现asn1-ber-syntax可能涉及以下步骤: 1. 定义ASN.1数据类型的Haskell表示。这通常涉及创建...
1. **BER编码** 是ASN.1的基础编码规则,提供了最灵活的编码方法,但可能导致相同的数据有不同的编码形式。它允许编码过程中的某些自由度,例如长度字段可以前缀或后缀,这使得BER编码不那么紧凑,但对于未知长度的...
- **BER编码算法**:实现BER编码规则,确保数据正确编码。 - **优化策略**:采用内存管理和循环展开等技术,提高编解码速度。 #### 四、应用场景 在移动通信国际漫游话单处理系统中,基于BER的ASN.1语法编译器及编...