ASN PER编译码规则技术总结.docx
- 文档编号:4239786
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:20
- 大小:32.27KB
ASN PER编译码规则技术总结.docx
《ASN PER编译码规则技术总结.docx》由会员分享,可在线阅读,更多相关《ASN PER编译码规则技术总结.docx(20页珍藏版)》请在冰豆网上搜索。
ASNPER编译码规则技术总结
ASN.1PER编译码规则技术总结
1.ASN.1语言简介
ASN.1(AbstractSyntaxNotationOne)是一种类型描述语言具有类似于面向对象程序设计语言中所提供的类型机制,它可定义任意复杂结构的数据类型,而不同的数据类型之间还可以有继承的关系。
标准包括:
ISO8824-1|ITU-TX.680:
Specificationofbasicnotation
ISO8824-2|ITU-TX.681:
Informationobjectspecification
ISO8824-3|ITU-TX.682:
Constraintspecification
ISO8824-4|ITU-TX.683:
ParameterizationofASN.1
ASN.1特别适合表示现代通信应用中那些复杂的、变化的及可扩展的数据结构。
ASN.1可分为两个部分:
语法规则:
从数据类型、内容顺序或结构方面来描述消息的内容。
编译码规则:
如何编译码实际消息的数据。
特点:
表达简单和复杂类型的能力;
类型根据大小或数值进行约束;
大写开头表示类型名,小写开头的表示变量名/字段名;
字段可以标记为OPTIONAL,便于扩展。
2.PER编码简介
3GPP的规范中,由ASN.1到传输码的转换统一使用定义在ITU-TX.691中的PER(PackedEncodingRules)规则,因此这里讲的ASN编译码规则也就是ASN编码中的PER编译码规则。
PER有两个变体:
对齐方式和非对齐方。
对齐方式用于:
Iub、Iur、Iu接口的ASN.1的传输编码。
非对齐方式:
仅用于空中(UU)接口的ASN.1转换,两者的编码过程基本相同。
在对齐的方式下,若前面所有单元的信息经编码后得到的比特流长度不是一个八位组的倍数,而后一个信息又是以八位组为单位的(字符串),那么就需要在前面生成的比特流后面补“0”,使其长度为8的倍数。
所以一般补的位数为0-7bit。
而非对齐的方式无此限制。
所有信息单元按编码规则生成的比特数据将按其被编码的顺序首尾相连,中间不需要任何填充。
按ITU-TX.691的规定,若最终的编码结束后。
所得的编码不是8的倍数,信息编码结束后的填充由RRC负责。
另外,PER编译码必须依赖于3GPP的标准文档。
也就是说,收发双方也必须知道层3消息的具体结构,这样编码和译码的才能被编译和识别。
2.1编码规则
分组编码规则包括三个部分:
preamble(前缀)、length(长度)、contents(内容)。
其编码格式如图1所示:
Preamble|length|Content
(1)preamble:
它只出现在ENUMERATED、SEQUENCE、SET、CHOICE四种数据结构的编码中。
用来记录结构中有无扩展项(extension)、选择项(optional)或缺省项(default)。
(2)length:
对STRING、SEQUENCEOF、SETOF等数据类型进行编码时,需对其长度按对齐方式进行编码。
(3)contents:
若数据是基本结构类型,如:
BOOLEAN、INTERGER、REAL、BITSTRING等,即可直接进行编码;若数据是复合结构类型,如SEQUENCE、SET、CHOICE、SEQUENCE OF等,则属嵌套编码,此时contents中也包含有preamble、length、contents三个部分。
(注:
在以下举例中,为对齐需要插入0的地方,以(pad)表示)
3.2范围受限的整数类型INTEGER(lb…ub)
lb为范围的下限,ub为上限,范围N=ub-lb+1。
PER针对N的大小不同,采用不同的编码方法,且对整数n进行编码时,以(n-lb)的值进行编码。
当N<=255时,整数编成不需对齐的1~8比特;当N=256时,编成需对齐的8个比特,当256 例如: 当ASN.1描述的数据maximumNestingDepth INTEGER(1…15)的值为3时,PER编码为0010;g711Alaw64k INTEGER(1…256)的值为10时,PER编码为(pad)00001001;而当statusDeterminationNumberINTEGER(0…16777215)的值为1000,PER编码是00000010 (pad)0010011100010000。 3.3对象标识符类型OBJECTIDENTIFER OBJECTIDENTIFER是一种用层次标识符来描述对象的方法;每一层为一标识符,用一个十进制整数表示。 例如: protocolIdentifier OBJECTIDENTIFIER可被赋值为{itu-t(0)recommendation(0)h(8)245version(0)3}。 protocolIdentifier由itu-t、recommendation、h245和version这四层标识符描述;用{0,0,8,245,0,3}十进制整数序列表示。 OBJECTIDENTIFER的编码方法为: length+各层标识符编码,其中length值按半约束整数类型编码。 PER并不分别对第一层和第二层的标识符整数值进行编码,而是将两层的整数值合并成’40*第一层整数值+第二层整数值’一个值来进行编码。 其他层次标识符整数值被对齐编码为8位比特串;其中首位是标志位,’1’表示整数值在该比特串没有被编码完,后面接着8位比特串还是原标识符整数值的编码;而’0’则表示整数值在该比特串编码完毕。 如上例: 由于0*40+0=0,所以第一二层的标识符被编码为: 00000000;第三层标识符的编码是00001000;245无法只用一个8位比特串表示,其编码为10000001 01110101;剩下的标识符分别被编码为00000000和00000011。 因为各层标识符的编码长度总共为6个字节,所以length=0x06。 protocolIdentifier的最后编码是: 0x060x000x080x810x750x000x03。 3.4CHOICE复合类型 CHOICE结构中有许多元素,每一个元素均有一个索引号,第一个元素的索引号为0, 第二个元素的索引号为1,依次类推,直到最后一个元素n。 其编码方法为: 索引号+所选元素编码。 如果在choice结构内有扩展标记(…),则在索引号前增加一个比特位’0’表示所选项在原列表内;增加一个比特位’1’表示所选为扩展内容。 例如: cause CHOICE { unspecifiedCause NULL, descriptorTooComplex NULL, … } 若cause的值为unspecifiedCause,则PER编码为00。 其中第一个0表示所选的不是扩展内容;第二个0表示所选的项为第一项。 3.5SEQUENCE复合类型 SEQUENCE结构中可能有扩展标记(…),也有可能有些元素为可选项(OPTIONAL)。 如果有扩展标记,编码的第一个比特表示有无扩展内容(0表示是非扩展项,1表示为扩展项);随后是若干个比特,其个数等于结构中可选项的个数,分别按位置顺序对应于每一个可选项,值’1’表示选用对应的可选项,值’0’表示不选;接着是结构中各个元素的内容编码。 例如: H261VideoCapability: : =SEQUENCE { qcifMPI INTEGER(1..4) OPTIONAL, cifMPI INTEGER(1..4) OPTIONAL, temporalSpatialTradeOffCapability BOOLEAN, … } 若H261VideoCapability的取值如下 { qcifMPI 3, tempralSpatialTradeOffCapability TRUE, } 则编码表示为010101,其中第一个0表示无扩展项;第二个1表示qcifMPI选用;第三个0表示cifMPI不选用;接着的10表示qcifMPI的值为3;最后的1表示tempralSpatialTradeOffCapability的值为TRUE。 3.6SETSIZE(lb…ub)OF和SEQUENCESIZE(1b…ub)OF复合类型 其编码形式为: 元素个数编码+各个元素内容编码;元素的个数按受限整数方式进行编码。 例如: AlternativeCapabilitySet : : =SEQUENCESIZE(1…256)OFCapabilityTableEntryNumber, CapabilityTableEntryNumber: : =INTERGER(1…65535) 若AlternativeCapabilitySet的取值为(1,2)时,则编码为: (pad)000000010000000000000001 4、RANAP协议描述分析 因为对RANAP的ASN.1语法还不是很清楚,以下描述是通过观察数据加上猜测得来,疏漏之处,还请见谅。 RANAP-PDU: : =CHOICE{ initiatingMessageInitiatingMessage, successfulOutcomeSuccessfulOutcome, unsuccessfulOutcomeUnsuccessfulOutcome, outcomeOutcome, ... } 这是RANAP的PDU的最高结构。 我们再来看InitiatingMessage的定义 InitiatingMessage: : =SEQUENCE{ procedureCode RANAP-ELEMENTARY-PROCEDURE.&procedureCode({RANAP-ELEMENTARY-PROCEDURES}), criticality RANAP-ELEMENTARY-PROCEDURE.&criticality({RANAP-ELEMENTARY-PROCEDURES}{@procedureCode}), valueRANAP-ELEMENTARY-PROCEDURE.&InitiatingMessage({RANAP-ELEMENTARY-PROCEDURES}{@procedureCode}) } ProcedureCode: : =INTEGER(0..255) Criticality: : =ENUMERATED{reject,ignore,notify} 我们举一个具体的value的例子 CommonID: : =SEQUENCE{ protocolIEsProtocolIE-Container{{CommonID-IEs}}, protocolExtensionsProtocolExtensionContainer{{CommonIDExtensions}}OPTIONAL, ... } ProtocolIE-Container{RANAP-PROTOCOL-IES: IEsSetParam}: : = SEQUENCE(SIZE(0..maxProtocolIEs))OFProtocolIE-Field{{IEsSetParam}} ProtocolIE-Field{RANAP-PROTOCOL-IES: IEsSetParam}: : =SEQUENCE{ idRANAP-PROTOCOL-IES.&id({IEsSetParam}), criticalityRANAP-PROTOCOL-IES.&criticality({IEsSetParam}{@id}), valueRANAP-PROTOCOL-IES.&Value({IEsSetParam}{@id}) } 可以看出ProtocolIE-Container是一个IE的数组,举一个具体的value作例子 PermanentNAS-UE-ID: : =CHOICE{ iMSIIMSI, ... } IMSI: : =TBCD-STRING(SIZE(3..8)) TBCD-STRING: : =OCTETSTRING 下面将结合数据来进行详细的解释 5、RANAP协议编码分析 000f4010000001001740095064005513000000f8 0------- 因为RANAP-PDU最后有扩展项,这个0表示无扩展 -00----- RANAP-PDU是个choice,而且有四项,这两个0表示选择的是第一项InitiatingMessage ---00000 为了对齐填上的0 00001111 表示这个PDU的类型是个CommonID 01------ Criticality为第二项ignore --000000 为对齐填上的0 00010000整个InitiatingMessage的value的长度 0------- 表示CommonID没有扩展参数 -0------ 表示CommonID的第一个可选参数没有 --000000 为对齐填上的0 0000000000000001 ProtocolIE-Container的数量,因为最大值maxProtocolIEs是65536,所以要用16位编码 0000000000010001 表示ProtocolIE-Container中的为id-PermanentNAS-UE-ID 01------ Criticality为第二项ignore --000000 为对齐填上的0 00001001 整个id-PermanentNAS-UE-ID的value的长度 0------- 表示PermanentNAS-UE-ID无扩展项(因为只有一项,所有没有哪一项的bitmap) -101---- 表示imsi的长度。 5表示该IMSI的长度为8(最小为3,3+5=8) ----0000 为对齐填上的0 64005513000000f8 为IMSI的值 3.PER的编码规则总结 一、对整数和域长的编码 在PER编码中,整数的编码和长度L的编码,在实际的结构类型编码中经常用到,是结构中对类型编码的基础,因此,下面首先讲述这两种编码的规则: 1.整数的编码 ①不受限的整数编码 不受限整数n的编码是以最小八位组来编码的。 它分成对长度的编码和对数的编码两部分,并且都是以八位组为单位来编的,若为负数则以2’s-compLetement来编码的(即以补码的形式编)。 例(with"L: "precedingtheLengthdeterminant–ifany-and"C: "precedingthecontentsencoding-ifany): integer1INTEGER: : =4096 integer2INTEGER(MIN..65535): : =127 integer3INTEGER(MIN..65535): : =-128 integer4INTEGER(MIN..65535): : =128 其编码为: integer1: L: 00000010C: 0001000000000000 integer2: L: 00000001C: 01111111 integer3: L: 00000001C: 10000000 integer4: L: 00000010C: 0000000010000000 以上例子可以看出: 当下限没有一个具体的值,而表示为一个任意小的数时,这种整数看作是不受限的整数来编码。 ②半受限的整数的编码 设n∈[bmin,+∞],d=n-bmin。 对n-bmin进行编码。 这种编码是以最小八位组来编码的,即为[Log256d]个八位组。 这个八位组的组数[Log256d]也将作为长度L来编码。 例: integer5INTEGER(-1..MAX): : =4096 integer6INTEGER(1..MAX): : =127 integer7INTEGER(0..MAX): : =128 编码为: Integer5: L: 00000010C: 0001000000000001 Integer6: L: 00000001C: 01111110 Integer7: L: 00000001C: 10000000 ③受限整数的编码: 对于一个整数n∈[bmin,bmax],d=bmax-bmin+1。 d=1时,有n=bmax=bmin。 这样的整数在发送方和接收方都知道,因此不需要编码。 在对齐的方式下: 当2≤d≤255,对n-bmin进行编码,是以二进制的最小位来编码的,编码的长度为与d相对应的长度。 长度域L不编码。 当d=256时,对n-bmin编码,长度为一个八位组,长度域L不编码。 当257≤d≤65536时,对n-bmin编码,长度为两个八位组,长度域L不编码。 当d≥65537时,对n-bmin编码,编码为最小的八位组数,即为[Log256d]octets.这个八位组的组数将以受限的整数在编码的前面以L域表示出来。 故L的区间为[1,Lmax]。 非对齐的方式下: n-bmin直接编码为二进制的最小位长度,长度域L不编码。 例: integer8INTEGER(3..6): : =3,4,5,6 integer9INTEGER(4000..4254): : =4002,4006 integer10INTEGER(4000..4255): : =4002,4006 integer11INTEGER(0..32000): : =0,31000 integer12INTEGER(1..65538): : =1,257,65538 其编码如下: integer8C: 00,C: 01,C: 10,C: 11 integer9C: 00000010,C: 00000110 integer10C: 00000010,C: 00000110 integer11C: 0000000000000000,C: 0111100100011000 integer12 非对齐方式: C: 00000000000000000, C: 00000000100000000, C: 10000000000000001 对齐方式: L: 00C: 00000000, L: 01C: 0000000100000000, L: 10C: 000000010000000000000001 二进制的最小位长度.可理解为编码所需的比特数,以后赋予的值都将以这个位数来进行编码,这点跟上面的例子是吻合的。 而后面的对齐方式是以八位组为单位,根据数所在八位组的范围来确定其表示八位组的个数,但前面要加长度的编码,这种情况在实际应用中见的不多。 ④一般最小的非负整数 如果0≤n≤63,在非八位组对齐方式下(非对齐方式下没有前同步码),前同步码为0,后面六位为n的编码。 编码形式为: 0nnnnnn 如果n≥64,在非八位组对齐方式下(非对齐方式下没有前同步码),前同步码位1,L为长度域,n作为一个受限的整数来编码(bmin看作0)。 编码形式为: 1··L··n 例: 5L: 0000101C: (5itemsofcontent) 60L: 0111100C: (60itemsofcontent) 254L: 1P0000000111111110C: (254itemsofcontent) 99000L: 1P11000100C: (64Kitemsofcontent) L: 11000010C: (32Kitemsofcontent) L: 1000001010111000C: (696itemsofcontent) 2.域长的编码 域长L的含义很广泛,在此可表示为: 比特串的长度、八位组的长度(OCTETSTRING和opentypes)、对已知字符串的描述、作为元素来描述(如果值为SEQUENCEOF或SETOF)等。 ASN.1描述规范中,对类型有长度的限制,一般可表示为SIZE(Lmin··Lmax),(Lmax可→+∞)。 长度L作为一个受限或半受限(Lmax→+∞)的整数来编码。 特别地,当Lmin=Lmax≤65535时,由于解码者事先知道故不用对L进行编码,类似地,若根据规定,某值不用编码,则长度为NULL,同样L不用编码。 在对齐方式下: 如果L为一个位图的长度,则对L-1和一般的非负整数编码一样。 如果Lmax≤65535时,L编码为一个受限的整数(在区间[Lmin..Lmax])。 如果Lmax≥65535(ie.64K)时,或上限Lmax是无限大时: a.如果L≤127,L编码为一个八位组,最高位为0。 即: 0LLLLLLL b.如果128≤L≤16383,L编码为两个八位组,高两位为10 例如: L=1301000000010000010 c.如果L≥16384,编码分成许多的单元,长度数为f×16K,(f=1、2、3、4)分成16384、32768、49152、65536。 编码时最高位为两个1,后六位为f值.即将长度L分成几个部分进行编码,下面将用一个例子来说明,L=147457=2×65536+16384+1的编码为: 1100010065536units1100010065536units 1100000116384units000000011unit 非对齐方式下: 如果L的长度为一个位图,则L-1作为一般的小整数来编码。 如果Lmax≤65536,L-Lmin编码为[Log2d]bits,d=Lmax-Lmin+1。 如果Lmax-Lmin≥65534,或Lmax为无限大。 a.L≤127,8bits。 0LLLLLLL b.128≤L≤16383,编码为16bits。 10LLLLLLLLLLLLLL c.L≥16384(16K),则和前面的对齐方式一样编码。 如果一种类型有一个可扩展长度的限制,并且它被传输的值不遵守扩展限制的规定,这样的长度将以半受限的整数来编码(Lmin=0,Lmax→+∞)。 二、各种类型编码 PER的编码规则定义了多种数据类型,简单的地可分为两大类。 第一类是结构类,如CHOICE、SEQUENCE、ENUMERATED等。 另
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ASN PER编译码规则技术总结 PER 译码 规则 技术 总结