`
chenming100_1976
  • 浏览: 41885 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ASN.1格式

 
阅读更多
ASN.1是“Abstract Syntax Notation One”的缩写。
ASN.1可以被看作一种高层协议描述语言,由于它可以用来清晰地描述复杂的数据结构,因而被广泛的作为应用层协议语法的标准。
ASN.1给协议设计者提供了一些简单的数据类型,如整型(Integer)、布尔型(Boolean)以及字节串(Octet string)等,以这些简单类型为基础,协议的设计者就可以构造出更复杂的数据类型。
通过唯一的“标识符(Tag)”可以很容易的标注出由一系列简单类型组成的复杂数据类型。
例如:一张话单可以由一系列数据域的集合组成,每个数据域是一个编码单元或者是多个编码单元的复合。
一个编码单元最多包括四部分:
 标识符(identifier octets,或者称为Tag):参见“1.2.1 标识符的编码规则”。
 长度(length octets):参见“1.2.2 长度的编码规则”。
 内容(contents octets):参见“1.2.3 内容的编码规则”。
 结束符(end-of-contents octets):不是必须的,在不定长编码方式下才使用,参见“1.2.4 结束符的编码规则”。

标识符表示该编码对应的协议数据类型,它的编码分两种情况:
情况一
标识符值在0-30之间时,用一个字节表示,其中各位含义如下,具体编码示意图如图1-1所示。
 位8和位7代表数据的类型标记(Universal-00, Application-01, Context-specific-10, Private-11)。
 位6代表该数据单元是原子式还是结构类型(Primitive-0, Construct-1)。
 位5到位1代表具体分配的TAG值(Number of Tag)。

 UNIVERSAL类型是ASN.1规范中定义的基本类型使用的,即是为基本类型进行分配TAG值用的,如BOOLEAN类型定义TAG值为1时使用。
 Application类型很少用到,不详述。
 Context-Specific主要是定义结构类型时使用。
 Private私有的,可以根据具体协商而定。
 Primitive原子式代表该域采用ASN最小编码单元编码。
 Construct结构式代表该域由多个ASN最小编码单元组成。
图1-1 标识符值在0-30之间编码示意图
                  8   7   6   5   4   3   2   1
              +-------+---+------------------+
            1 ¦ CLASS ¦P/C¦  TAG NUMBER       ¦
              +------------------------------+
               Bits 8-7: 数据的类型标记:
              +------------------------------+
              ¦                  Bit: 8   7       ¦
              +-------------------------------¦
              ¦ Universal            0   0       ¦
              ¦ Application          0   1      ¦
              ¦ Context-specific    1   0      ¦
              ¦ Private               1   1      ¦
              +------------------------------+
               Bit  6  :原子式 (0) 或  结构类型 (1)
               Bits 5-1: 5个比特的二进制数
情况二
标识符值大于等于31时,用一个前字节和若干后续字节表示。
 前字节的位8、7、6与第一种情况一样,位5到位1为11111。
 后续字节遵守以下规则:
− 除最后一个字节外,其他字节的第8位为1。
− 从第一个字节到最后一个字节的第7位到第1位加起来表示tags值。
− 第一个字节的第7位到第1位不能全为0。
如图1-2所示。
图1-2 标识符值大于等于31时编码示意图
                  8   7   6   5    4   3   2   1
              +-------+---+---+---+---+---+---¦
            1 ¦ CLASS ¦P/C¦ 1 ¦ 1 ¦ 1 ¦ 1 ¦ 1 ¦
              +-------------------------------+

               Bits 8-7: 数据的类型标记
               Bit  6  : 原子式 (0) 或  结构类型 (1)
               Bits 5-1: 全部设置为1

后续字节编码如下:
                 8   7   6   5   4   3   2   1
              +---+---------------------------¦ first
            2 ¦ 1 ¦  NUMBER of TAG (msb)       ¦ subsequent
              +-------------------------------¦
              .                               .
              .                               .
              +-------------------------------¦ last
              ¦ 0 ¦  NUMBER of TAG (lsb)        ¦ subsequent
              +-------------------------------+

               Bits 8 :  最后一个字节时,设置为0,其他均设置为1
               Bits 7-1: 所有字节的比特7-1都加起来,就是实际的Tag值。
1.2.2 长度的编码规则
长度表示内容字段的净长度,不包括内容以外的其他字段的长度。
长度有三种表示形式:短编码方式,长编码方式和不定长编码方式。其中,不定长编码方式不应用于ASN.1话单文件中,因此不做更进一步的描述。
短编码方式
当长度<=127时,用一个字节表示,即为短编码方式:
 第8位为0。
 第7到第1位表示长度。
如L=26H,则编码为 0010,0110。
                8   7   6   5   4   3   2   1
              +----------------------------¦
            1 ¦ 0   L   L   L   L   L   L   L ¦
              +----------------------------+
                             LLLLLLL 表示实际长度的值
长编码方式
当长度>127时,用多个字节表示,即为长编码方式:
                8   7   6   5   4   3   2   1
              +---+-------------------------¦
            1 ¦ 1 ¦      0 < n < 127          ¦
              +-----------------------------+
              +-----------------------------¦
            2 ¦ L   L   L   L   L   L   L   L  ¦
              +-----------------------------+
                           ...
              +-----------------------------¦
           n+1¦ L   L   L   L   L   L   L   L  ¦
              +-----------------------------+
            LLLLLLLL表示实际长度的值

 第1个字节的位8固定填写为1,BIT1~BIT7表示长度所占的字节数。
 第2到n+1字节代表长度的值。
1.2.3 内容的编码规则
内容包含零个、一个或更多的字节,它们的值依赖于所表示的数据类型。
如下图所示:
                8   7   6   5   4   3   2   1
              +------------------------------¦
              ¦  most significant byte         ¦ octet 1
              +------------------------------¦
              ¦                                    ¦ octet 2
              +------------------------------¦
              .                               .
              .                               .
              +------------------------------¦
              ¦ least significant byte        ¦ octet n
              +------------------------------+
下面对不同的数据类型分别进行介绍。
 BOOLEAN
该类型只能以原子式进行编码。
FALSE编码为:
Tag    Length        Value
+------------------------------¦
¦  01H   ¦   01H  ¦ 0000, 0000   ¦
+------------------------------¦
TRUE的编码(任何不是全0都可以)为:
Tag    Length        Value
+------------------------------¦
¦  01H   ¦   01H  ¦ 1111, 1011   ¦
+------------------------------¦
 NULL
该类型只能以原子式进行编码,且只有一个值,这样其Value中就无需填写,即Value处就不会占用空间。
Tag    Length        Value
+------------------------------¦
¦  05H   ¦   00H  ¦
+------------------------------¦
 INTEGER
该类型只能以原子式进行编码。整型分正数和负数两种情况,由于负数不应用于ASN.1话单文件,不加以详述。
对于正数,如果最高比特位为0,则直接编码;如果为1,则在最高比特位之前增加一个全0的八位数组(采用的是补码的方式存储)。如下示例250的编码:
Tag     Length           Value
+-------------------------------------¦
¦  02H   ¦   02H  ¦  0000,0000 1111,1010¦
+-------------------------------------¦
 ENUMERATED
该类型编码与INTEGER类型编码方式相同。
 BIT STRING
该类型可以采用原子式或者结构式,下面以比特串'1011011101011'B为例,分别介绍以这两种方式进行编码。
Primitive
Tag    Length             Value
+------------------------------------------¦
¦  03H   ¦   03H  ¦    03H   10110111 01011xxx¦
+------------------------------------------¦
注意在比特串'1011011101011'B之前增加了一个八位数组,取值为0~7,表征这个值最后补位的个数,主要是解决比特串可能不是8的倍数。
Constructed
采用结构式发送时,主要是有部分编码还不能确定时采用,比特串'1011011101011'B的编码如下:
Tag       Length               Value
+----------------------------------------------¦
¦  03H   ¦   80H ¦    T          L           V
¦                   ¦    03H  ¦   02H  ¦ 00H 10110111¦
¦                   ¦    03H  ¦   02H  ¦ 03H 01011xxx¦
                          00H      00H
+-----------------------------------------------¦
注意:此处整个比特串的Length采用不定长编码。
 OCTET STRING
该类型编码原则和BIT STRING编码原理一样,但由于该类型直接以八位组为单位,就不存在补位的情况。
 SET
该类型采用constructed格式编码,其每个成员都是采用TLV格式编码。
以MOC {recordType ENUMERATED, callDuration INTEGER }:={ recordType  0,callDuration 11}为例:
Tag       Length               Value
+--------------------------------------------¦
¦  16H   ¦   80H ¦    T          L           V
¦                   ¦    02H  ¦   01H  ¦ 0000 0000¦
¦                   ¦    02H  ¦   01H  ¦ 0000 1011¦
+--------------------------------------------¦
 SEQUENCE
该类型与SET类型编码方式基本一样,只是其成员顺序要与定义保持一致,而SET类型无需如此。
 SET OF
该类型编码与SET相同。
 SEQUENCE OF
该类型编码与SEQUENCE相同。

其他的不常见的类型,在此不一一介绍。
1.2.4 结束符的编码规则
在定长编码结构中不存在,只有在不定长编码结构中存在,此处不加以详述。

1.2.5 话单文件的结构
一个话单文件是Sequence类型,采用TLV格式,其Valve部分由以下四部分组成:
 第一部分是文件头部headerRecord,TAG是A0。
 第二部分是话单内容,SEQUENCE OF表示可以由多张话单组成,callEventRecords的TAG值是A1。
 第三部分是文件尾部trailerRecord,TAG值是A2。
 第四部分是扩展,TAG值是A3,该部分没有内容,长度为0。
各个部分的TAG值和长度在文件中的位置如图1-3所示。
图1-3 话单文件的结构


以一张ASN.1话单文件为例,其二进制码流,如图1-4所示。
图1-4 ASN.1话单文件二进制码流解析


上图所对应的ASN.1文件:
 ASN.1 BER编码

 解码后的文本
record no.: 0
recordType: moCallRecord
servedIMSI: 460007001002000
servedMSISDN: (91)8613720012000
callingNumber: (91)8613720012000
calledNumber: (A1)13720012010
roamingNumber: (A1)136755002201
recordingEntity: (91)86136755002
mscIncomingROUTE: TO_BSC1
mscOutgoingROUTE: TO_BSC2
location: LAC-3001. CellID-0001
basicService: teleService(11)
msClassmark: 021C00
answerTime: 070809141502
releaseTime: 070809141513
callDuration: 11
radioChanRequested: fullRateChannel
radioChanUsed: halfRate
causeForTerm: normalRelease
diagnostics: gsm0408Cause(90)
callReference: 16 00 00 00 ED
additionalChgInfo: chargeIndicator-charge
networkcallReference: 16 05 A2 30 1B
mSCAddress: (91)86136755002
speechVersionSupported: 1
speechVersionUsed: 1
systemType: gERAN
chargedParty: callingParty
mscOutgoingCircuit: 1
orgRNCorBSCId:  01 0B
orgMSCId:  00 0B
callerDefaultEmlppPriority: EMLPP_CallPriorityLevel4(1)
globalAreaID:  64 F0 00 30 01 00 01
subscriberCategory: Common(A)
firstmccmnc: 64F000
lastmccmnc: 64F000
calledIMSI: 460007001002010
typeOfSubscribers:visiting
audioDataType:audio
disconnectparty:unknown


分享到:
评论
1 楼 thisislife 2011-10-27  
文件解压需要密码?哥们

相关推荐

    ASN.1格式解析源码

    一个简单的ASN.1格式解析工具,可将ASN.1格式输出。ASN.h(.cpp)包含了ASN.1格式的解析类,ASNFileParse.cpp中提供了常用的pem文件、der文件的解析。本源码未使用Openssl库。 开发环境:Windows+VS2010

    java 解析ASN.1 编码格式cdr话单文件例子

    NULL 博文链接:https://sanry.iteye.com/blog/2297657

    asn.1抽象标记语言总结(per和oer编码规则)

    ASN.1:抽象标记语言 PER:压缩编码规则(Packed Encoding Rules),ASN.1编码规则之一 OER: 八位字节编码规则(Specification of Octet Encoding Rules),ASN.1编码规则之一

    开源工具软件 ASN.1 Editor

    ASN.1 Editor,该软件的功能包括:显示、编辑、格式化及转换 ASN.1 编码格式的数据,使用它的前提是用户计算机上已经安装了 .NET Framework 4.5。

    ASN.1 规则详解 .zip

    ASN.1抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。本文是ASN.1 标准详解 ,这是中文版本的ASN.1标准,这是标准最全的解释,...

    ASN.1探索《ASN.1 Communication between Heterogeneous Systems》

    ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序...

    ASN.1-Complete.rar_ASN.1 Complete_ASN编码_asn.1

    学习ASN.1必备,国内外介绍ASN.1编码格式最全的文章

    ASN.1PER编码方式以及测试程序

    1 ASN.1编码格式 2 ASN.1PER编码测试以及测试源程序

    ASN.1 傻瓜用书(english)

    抽象语法标记(ASN.1)是一种ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式. 它是关于ASN.1 傻瓜用书。

    ASN.1编码规则详解

    BER(Basic Encoding Rules)是ASN.1中最早定义的编码规则,在讨论详细编码规则时,我们是基于正确的抽象描述上。BER传输语法的格式一直是TLV三元组, Length, Value&gt;也可以认为是, Length, Value&gt;(见图4-1)。TLV每...

    解析和制作ASN1的Csharp的dll

    可以用来制作ASN1格式规定的ber,der,pfx等格式的文件.可以制作数字证书,可以制作电子印章等

    ASN.1编码查看工具:Asn1View

    Asn1编码查看工具,查看ASN1编码的结构,用于核对编码的正确性,不错的工具,物美价廉,欢迎大家下载!

    《国密算法》--ASN.1 文件解析,实现openssl生成的RSA公钥算法密钥文件以及ECC椭圆曲线算法(国密SM2).zip

    个人实战积累的成果,基于国密算法的总结,希望可以帮到您 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~ 个人实战积累的成果,基于国密算法的总结,希望可以帮到您 亲们下载我任何一个...

    PKCS7签名的ASN1格式

    可使用此格式,通过ASN1C生成完整的PKCS7签名C语言代码,实现诸如SM2算法数字签名及验证。 注意,CertificateSerialNumber本来在PKCS7标准ASN1结构中定义为INTEGER类型,但由于ASN1C将INTEGER类型翻译成long,不支持...

    ASN.1抽象语法标记

     ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用...

    asn1c:ASN.1编译器

    asn1c可以说是最先进的开源ASN.1编译器。 ASN.1传输语法 ASN.1编码互操作性表ASN.1系列标准定义了多种数据编码方式,包括面向字节的(例如BER),面向比特的(例如PER)和文本的(例如XER)。 一些编码变体(例如...

    爱立信STS话务ASN.1文件格式说明

    爱立信STS话务ASN.1文件格式说明,对于转换成普通文本有所帮助.

    ASN.1----berviewer (编解码查看器)

    是一个简单的查看asn1,ber编码格式文件的工具。

    ASN.1资料和编码规则

    ASN.1的格式说明和基本编码规则,很实用啊

    11728asn1berder.pdf

    ASN.1抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及...

Global site tag (gtag.js) - Google Analytics