西安星河亮点信息技术有限公司
ASN.1编解码规则之类型定义
ASN.1最基本的概念是类型和值,一个类型是一组值的集合,表示潜在的传送信息,实际中,只有值被传送,类型分为简单类型、复合类型、子类型三类;
简单类型是ASN.1的基本组成部分,通常用来描述事物的单一属性。复合类型由一个或者多个它的域构成,这些域可以使任意类型,子类型是其父类型的变形,前者的值域是后者值域的子集; 简单类型: 1. BOOLEAN类型
又称布尔类型,有两种可能的取值:“TRUE”和“FLASE”;RRC协议中不存在对此类型的单独定义,一般将其定义在SEQUENCE类型内,具体的定义和赋值方法如下表所示:
定义 DL-CommonInformation-r4 ::= SEQUENCE{ ?? std-Indicator BOOLEAN, ?? } 赋值 Example DL-CommonInformation-r4 ::= { ?? tstd-Indicator TRUE, ?? } BOOLEAN的编码结果为1个比特:1或者0,分别对应TRUE或者FLASE,因此,tstd-Indicator的编码结果是1(郭丹的论文里面是0); 2. NULL类型
又称为空类型,表示信息中不包含任何内容,传递时接收方知道与其相关的语义,该类型适合传递报告或者确认消息,和BOOLEAN一样,RRC协议中也不存在对该类型的单独定义,而将其定义在SEQUENCE中,如下表所示:
定义 RadioBearerSetup-r3-IEs ::= SEQUENCE{ ?? tdd NULL, ?? } 第 1 页 共 6 页
西安星河亮点信息技术有限公司
赋值 Example RadioBearerSetup-r3-IEs ::= { ?? tdd NULL, ?? } 不需要对NULL类型数据进行编码,如果它是CHIOCE或者SEQUENCE的可选域或者缺省域,导言作为此类型的索引来确定是否存在该类型的数据; 3. INTEGET类型
又称为整数类型,它的值集合是任意长度的整数,可以将该类型数据定义成一个常数,也可以使用子类型限制语句将其值限制在一个区间内取值,定义如下表所示:
定义 MaxROHC-profile-r4 INTEGER ::= 8 CD-AccessSlotSubchannal ::= INTEGER(0..11) 赋值 Example CD- AccessSlotSubchannal ::= 0 如果该类型被定义为常数时,不需要编码,因为解码一方也知道相同的构文,从而可以正确解码,因此MaxROHC-profile-r4的编码结果为空,反之,需要编码,比如CD-AccessSlotSubchannal在有限范围内取值,有12个值可以取,因此用四位比特数来对它进行编码,所以CD-AccessSlotSubchannal的编码结果是0000; 4. ENUMERATED类型
又称枚举类型,当需要列出对象清单的时候,就要用到该类型,他经常被用来描述系统状态或者错误报告,该类型的定义和复制方法如下表所示:
定义 RRC-StateIndicator ::= ENUMERATED{ Cell-DCH,cell-FACH,cell-PCH,ura-PCH } 赋值 Example RRC-StateIndicator ::= cell-FACH; 有四个选项,因此使用2个比特位来进行编码,RRC-StateIndicator的编码结果是01; 5. BIT STRING类型
又称为二进制比特串类型,该类型值可以为空或者任意长,常被用来定义那些可以表示为二进制或布尔向量的数据,比特串最左边的比特是第一位,最右边的比特是最末位;
该类型的表示有单引号界定,二进制形式由数字0和1组成,后面附加字母B,十六进制形式由数字0~9和字母A~F组成,后面附加字母H,位串的长度应该尽量使用子类型进行限制,因为这能使编码器分配合适的空间,保证编码更加简短,构文如下表所示:
定义 赋值
C-RNTI ::= BIT STRING(SIZE(16)) Example C-RNTI ::= ‘0010010000111100’B 第 2 页 共 6 页
西安星河亮点信息技术有限公司
定义 AccessServiceClass-FDD ::= SEQUENCE{ ?? assignedSubChannelNumber BIT STRING{ b3(0),b2(1),b1(2),b0(3) } (SIZE(4)) } 赋值 Example2 AccessServiceClass-FDD ::= { ?? assignedSubChannelNumber : ‘0010’B } 对于固定长度的BITSTRING类型,编码时不需要长度域,编码结果即为比特值,反之要在前面加上长度域,上表中该类型的比特串是固定值的两种定义和相应赋值方式,“example1”和“assignedSubChannelNumber”的编码结果分别为“0010010000111100”和“0010”;
6. OCTET STRING类型
又称为八位比特串类型,该类型编码时候,比特位后面有时需要填充值为0的比特,以使比特位的位数达到8的整数倍;
定义 赋值 NAS-SystemInformationGSM-MAP ::= OCTET STRING(SIZE1..8) Example NAS-SystemInformationGSM-MAP ::= ‘31’H 因为长度是范围是1..8,example的取值是2个8位比特组,因此长度域为“001”,它的完整编码是“00100110001”我觉得是应该是这个00100011001; 复合类型
1. SEQUENCE类型
每个域由小写字母开头的标识符来定义,还可以用OPTIONAL和DEFAULT来标记这些域可选和缺省域,构文如下表所示:
定义 DL-DCCH-Message ::= SEQUENCE{ integrityCheckInfo IntegrityCheckInfo OPTIONAL message DL-DCCH-MessageType } 赋值 N-CR-T-CRMaxHyst ::= SEQUENCE{ n-CR integer(1..16) DEFAULT 8 t-CRMaxHyst T-CRMaxHyst } 对SEQUENCE类型编码是根据从上到下,从外层到内层的顺序依次对内嵌的每个域进行编码,编码时,每个可选域和缺省域都用一个比特的导言来表示是否存在于
第 3 页 共 6 页
西安星河亮点信息技术有限公司
SEQUENCE类型数据中,分别用“0”、“1”来表示,如果不存在就不对该域进行编码,反之进行编码;
DEFAULT后面默认值应该和该域的类型一致,对被它标记的域进行编码时,如果赋值等于其缺省值,则编码时导言为“0”且后面没有对值的编码,如果为“1”,后面有对值的编码,对具有DEFAULT标记的域进行解码时,如果导言为1,该域的值对应于值域中的值;如果导言为0,该域的值为缺省值; 2. SEQUENCE OF类型
该类型相当于一些程序设计语言中的动态数组或链表,其内所有的域都是同一类型且数量是可变的,如下表所示:
定义 IMSI-GSM-MAP ::= SEQUENCE(SIZE(6..21)) OF Digit Digit ::= INTEGER(0..9) 赋值 Example IMSI-GSM-MAP ::= { 0, 0, 1, 1, 3, 6, 5 } 对SEQUENCE OF类型的数据进行编码时,如域的个数是固定的,就没有长度域,否则,用长度域表示域的个数,接下来依次对每个域进行编码,“example”的长度域是“0001”,全部的编码结果是“0001 0000 0000 0001 0001 0011 0110 0101”; 3. CHIOCE类型
该类型有几个域可供选择,具体构文如下表所示: 定义 TFCS-InfoForDSCH ::= CHOICE { ctfc2bit INTEGER (0..3), ctfc4bit INTEGER (0..15), ctfc6bit INTEGER (0..63), ctfc8bit INTEGER (0..255), ctfc12bit INTEGER (0..4095), ctfc16bit INTEGER (0..65535), ctfc24bit INTEGER (0..16777215) 赋值 Example TFCS-InfoForDSCH ::= ctfc4bit : 3 CHIOCE类型首先用导言指示选择哪一个域,化成十进制就是0代表第一项,以此类推,后面紧跟所选项的编码结果,对“example”的编码结果为“001 0011”; 子类型
在某些情况下,只需要ASN.1类型取值的一些子集是有效的,有时候,只需要一些特定范围内的子集有效,子类型定义是通过在父类型记法后面附加适当的子类型说明来实现的,子类型可用“|”将不同的父类型值域的子集分开,整个表达式位于圆括号内,如下表所示:
第 4 页 共 6 页
相关推荐: