




已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要基于ASN.1 BER规约的编解码系统设计摘 要ASN.1是一种高级抽象语法标记语言,在任何需要以数字方式发送信息的地方,ASN.1都可以发送各种形式的信息(声频、视频、数据等),它以一种独于计算机架构和语言的方式来描述数据。BER是ASN.1中的基本编码规则,它描述具体的ASN.1对象如何编码成比特流在网络上进行传输,数据首先经过BER编码,再经由传输层协议发送到接收方,接收方在相应的端口收到数据包后,经过BER解码,得到具体的操作数据。本文的主要工作就是设计实现一个基于ASN.1 BER规约的编解码系统。本文分析比较了ASN.1定义的数据值编码算法。开始部分对BER编码规则进行比较详细的分析,按照标识符八位位组,长度八位位组,内容八位位组的编码结构,讨论比较编码的各种算法及其特点,并由此确定本文数据值编码环节中所采用的编码算法。由ASN.1 BER定义的数据值编码的算法,设计出各种数据值编码程序的流程图,用C/C+程序设计语言,在Microsoft Visual C+ 6.0环境下编写编码程序。在编写出完整的编码程序后,运行测试程序,给出相应的数据值编码结果截图,验证编码算法的正确性。本文成功实现了一个基于ASN.1 BER规约的可视化编解码通信系统。在VC(MFC)平台下,基于已实现的数据值编码模块和解码模块,使用UDP协议,简单模拟两台计算机通过ASN.1 BER规约,编码、传输、解码数据。所设计的编解码可视化通信系统,在一定程度上模拟了ASN.1在表示层的具体应用。关键词:ASN.1,BER,编码,算法,可视化编程IIAbstractDesign of Encoding and Decoding System Based on ASN.1 BERAbstractASN.1-Abstract Syntax Notation One-is a high-level language, which can send information in various forms, such as audio, video, data, etc, to anywhere that information can be sent through figures. It describes data in the way owned by computer structure and computer language. BER is the basic encoding rules of ASN.1, which describes how a specific object ASN.1 encoded bit stream for transmission on the network. The data first passes through the BER encoding, then being sent to the receiver via the transport layer protocol. The receiver receives data packets in the corresponding port, and then gets the specific operation data after BER decoding. This paper is designed to implement an encoding and decoding system based on the ASN.1 BER Statute. This paper analyzes and compares the data value encoding algorithm defined in ASN.1. This paper first gives a detailed analysis of BER encoding rules, discussing and comparing the various algorithms encoding and characteristics in accordance with the identifier octet, octet length, content, coding structure octets. In this way, the author determines the data value encoding part of the encoding algorithm used in this paper. Design a variety of data value encoding process flow chart according to the ASN.1 BER encoded data value algorithm. Write code procedures under Microsoft Visual C + + 6.0 environment by using C / C + + programming language. Run the test program after encoding in the preparation of a complete program, and then give the results of the corresponding data value encoding capture, verifying the coding algorithm. This paper is designed to implement a visualizing system based on ASN.1 BER Statute successfully. Based on data values that have been achieved encoding module and decoding module, this paper, using the UDP protocol in the VC (MFC) platform, demonstrates a simple simulation of two computers coding, transmission and decoding data through ASN.1 BER. The encoding and decoding visual communication system designed in this paper, to a certain extent, is a simulation of ASN.1 specific application in the presentation layer.Keywords: ASN.1, BER, Encoding, Algorithm, Visual programming目录目录摘要IAbstractII目录III第一章 绪论11.1 ASN.1 BER规约概述11.2 ASN.1 BER规约的应用与发展前景21.3 本文内容和结构安排3第二章 ASN.1 BER的编码算法42.1 ASN.1 BER数据值的编码组成42.1.1 标识符八位位组42.1.2 长度八位位组52.1.3 内容八位位组62.1.4 内容结束八位位组62.1.5 数据值编码结果的存储方式62.2 布尔值72.3 整数值和枚举值72.4 实数值92.4.1 实数值的编码规则92.4.2 实数值的精度102.4.3 实数值的编码算法112.5 位串值122.6 八位位组串值132.7 空值132.8 结构化值132.8.1 序列值132.8.2 单一序列值142.8.3 集合值142.8.4 单一集合值152.8.5 选择值152.9 本章小结15第三章 基于ASN.1 BER规约的编码实现163.1 布尔值的编码163.2 整数值和枚举值的编码173.3 实数值的编码193.3.1 实数值编码分析193.3.2 单精度浮点数编码213.3.3 双精度浮点数编码223.4 位串值的编码233.5 八位位组串值的编码243.6 空值的编码253.7 结构化编码273.7.1 序列值的编码273.7.2 单一序列值的编码293.7.3 集合值的编码293.7.4 单一集合值的编码303.8 编码系统303.8.1 编码系统的设计说明303.8.2 编码系统设计流程图313.8.3 编码系统运行结果323.9 本章小结34第四章 基于ASN.1 BER规约的可视化编解码系统及通信354.1 ASN.1 BER 可视化编解码系统354.2 编解码系统通信的实现364.3 编解码通信系统功能扩展394.4 编解码通信系统测试404.5 本章小结44第五章 总结455.1 主要内容回顾455.2 本次设计的不足和进一步的完善45致谢47参考文献48附录A High-performance ASN.1 compiler49附录B 高性能的ASN.1编译器5561第一章 绪论第一章 绪论1.1 ASN.1 BER规约概述ASN.1(Abstract Syntax Notation One)是一种抽象语法标记语言,它通过定义若干个简单类型和由简单类型复合而成的结构类型,在表示层用一致的形式来表示应用层的复杂多样的数据,便于异构系统间的通信。ASN.1是一种ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行,也不用去管到底是什么样的应用程序。BER(Basic Encoding Rules)是ASN.1的基本编码规则,它是一种传送语法,它可以把复杂的用抽象语法描述的数据结构表示成简单的数据流,从而方便数据的传送。它是描述怎么把一个ASN.1类型的值表达或编码为8位字位串的字节串。在通信系统中,为了让通信双方对通信媒介中传输的信息产生一致的理解,通信双方就必须明确所交换信息的类型与格式规范。而ASN.1 BER规约就是用来明确交换信息的一种类型和格式规范。ASN.1 BER的编解码分为原始编解码和结构化编解码。原始编解码数据值有:布尔值、整数值、枚举值、实数值、位串值、八位位组串值和空值;结构化编码数据值有:序列值、单一序列值、集合值、单一集合值等。无论是原始类型还是结构化类型,它们都遵循一致的编码结构。ASN.1 BER的编码结构如图1-1所示,替换的结构化编码如图1-2所示。图1-1 编码结构图1-2 替换的结构化编码根据BER编解码规则,数据对象的编解码有标识段、长度字段和值字段三部分组成。标识符字段用于识别传输字节串值的数据类型,由值的标签类别、值的编解码方式和标签值组成;长度字段指明值中八位位组的数目;值字段是对值本身的编码,在原始编码中,该字段表示数据的实际值,而在结构化编码中该字段是一个或多个数据的完整编码形式(包括标识符字段,长度字段和值字段)。ASN.1以一种高度抽象的形式表示数据结构信息,与其他表示语言相比,它具有如下特点:1、ASN.1与具体的平台与编程语言无关,为数据类型(例如:整形,实数,比特,字符串)的定义提供了一种和实现无关的机制。2、ASN.1使用了对象的概念,对象是定义为具有类型和值的信息实体,可以很容易从一种格式翻译成另一种格式,使用相应得ASN.1工具可以将ASN.1描述的结构化信息映射成某种语言的数据结构表示形式。3、在数据传输时,ASN.1提供了相应的编码规则,可以利用工具生成的编解码函数将数据结构自动转换为传输所需要的位模式。4、ASN.1提供了比普通编程语言更丰富的数据结构,支持以简单成员构建任意复杂结构,支持嵌套结构以及嵌套结构任意深度从而满足特殊需要。因为ASN.1表示数据的能力比普通编程语言强的多,越复杂的描述信息则越能体现出ASN.1的优越性。5、ASN.1 的编码方法比许多与之相竞争的标记系统更先进,它支持可扩展信息快速可靠的传输,在无线宽带中,这是一种优势。1.2 ASN.1 BER规约的应用与发展前景在任何需要以数字方式发送信息的地方,ASN.1 都可以发送各种形式的信息(声频、视频、数据等等)。ASN.1和特定的ASN.1编码规则推进了结构化数据的传输,尤其是网络中应用程序之间的结构化数据传输,它以一种独立于计算机架构和语言的方式来描述数据结构。今天在实际中已有大量应用,这些应用包括:1、GSM系统空中接口上传递的补充业务内容采用了ASN.1的BER编码格式,其RRM模块以及其他层消息均采用CSN.1编码。 2、变电站通信在电力系统,铁路供电系统中,按照变电站通信网络和系统系列标准IEC61850应用层消息结构与ASN.1之间的对应关系,设计ASN.1编解码模块,实现变电站自动化通信系统。3、IP语音在通信领域中的另一个重要应用是通过包转换网络(如因特网)传递语音数据。多媒体数据信号编解码器(CODEC)标准(H.323等等)基于ASN.1并且使用于分组编码标准来获取理想的数据传输速率。 4、安全应用因特网安全授权同样也使用了ASN.1。高级编码标准在数据表示方面形成了一个方便的、平台无关的标准,比加密要优越。PKIX、PKCS和X.509等标准也是基于ASN.1的。1984年,ASN.1 就已经成为了一种国际标准,它的编码规则已经成熟并在可靠性和兼容性方面拥有更丰富的历程。在变电站通信系统,GSP系统,移动3G系统,信息安全等方面已经有了广泛的应用,随着信息技术的发展,ASN.1将会有更加广阔的空间。 1.3 本文内容和结构安排本文根据ASN.1的基本编码规则,设计编写一个编解码系统。论文共有五章,各章的主要内容安排如下:第一章简要概述ASN.1 BER规约的特点,当前应用和发展前景,简单介绍了ASN.1 基本编码规则的编码结构。第二章分析ASN.1 BER的基本编码规则,照标识符八位位组,长度八位位组,内容八位位组的编码结构,讨论比较数据值编码的各种算法及其特点,并由此确定本文数据值编码环节中所采用的编码算法。第三章设计数据值编码程序的流程图,使用C/C+程序设计语言,在Microsoft Visual C+ 6.0环境下编写编码程序,运行测试程序,给出相应的数据值编码结果截图,验证编码算法的正确性。第四章使用MFC,设计基于ASN.1 BER的编解码可视化系统, 通过UDP协议,简单模拟两台计算机应用ASN.1 BER规约,编码、传输、解码数据的过程。第五章总结本文的主要工作内容,指出本次设计的不足之处,提出改进意见。第二章 ASN.1 BER的编码算法第二章 ASN.1 BER的编码算法ASN.1定义了丰富的数据值类型,并给出了详细的编码规则,这些规则约定了数据值应该按照何种结构编码为二进制比特流。根据这些编码规则,本章分析数据值编码的各种算法,讨论比较其算法的优劣,确定本文对数据值编码时采用的算法。2.1 ASN.1 BER数据值的编码组成数据值的编码应有下列次序的4种成分组成:1) 标识符八位位组2) 长度八位位组2) 内容八位位组3) 内容结束八位位组其中内容结束八位位组,只有长度八位位组的值需要时才出现,即数据值编码结构有两种形式,见图1-1和1-2,此处不再赘述。下面分析数据值的4种组成成分。2.1.1 标识符八位位组标识符八位位组是对数据值类型的ASN.1标签(类和编号)进行编码。表2-1 标签类的编码类位8位7通用00应用01上下文特定10专用111) 编号范围在030为低标签编号,其编码结构见图2-1。编码规则说明:图示中的标签编号(即位5至位1),应把标签编号编码为无符号二进制整数,位5为最高有效位。图2-1 标识符八位位组(低标签编号)2) 编号大于30为高标签编号,其编码结构见图2-2。编码规则说明如下:1) 标识符八位位组应包含一个引导八位位组及后随的一个或多个后继八位位组;2) 位5至位1编码为:111112;3) 后接后继八位位组,以第一个后继八位位组的位7为最高有效位,其余部分编码规则见图2-2所示;4) 第一个后继八位位组的位7至位1不应都为0。图2-2 标识符八位位组(高标签编号)2.1.2 长度八位位组长度八位位组的形式有两种:确定形式跟不定形式。u 确定形式应用条件:原始编码;都是立即可用的结构化编码。编码方式:短形式内容八位位组数小于或等于127时; 长形式内容八位位组数大于127时。编码规则:短形式由单个八位位组组成,把内容八位位组组数编码为无符号的二进制整数,位7为最高有效位; 长形式由一个初始八位位组和一个或多个后继八位位组组成,初始八位位组应不使用值111111112。例如:L=30,使用短形式编码:00011110;L=201,使用长形式编码,可编码为: 100000012 初始八位位组 110010012 后继八位位组u 不定形式应用条件:不都是立即可用的结构化编码。编码方式:同确定形式,参照上文。编码规则:短形式由单个八位位组组成,由内容结束八位位组来终止,位8应置1,位7至位1置为0; 长形式在内容八位位组之后的编码中出现内容结束八位位组。2.1.3 内容八位位组内容八位位组应由0个、1个或多个八位位组组成,它依赖于数据值的类型。具体编码规则见后续章节,如布尔值,整数值,实数值内容编码等。2.1.4 内容结束八位位组长度按不定形式规定编码,则应出现内容结束八位位组。内容结束八位位组由两个值为0的八位位组组成。内容八位位组可认为是值的编码,其标签为通用类,形式为原始编码,标签号为0,且内容不存在。其编码结构见表2-2。表2-2 内容结束八位位组结构内容结束八位位组长度内容00160016无2.1.5 数据值编码结果的存储方式对于一个给定的数据,如整数值100,它的编码应该包含三部分:标识符八位位组,长度八位位组和内容八位位组,每一部分编码的结果应该先保存,最后再把各部分连接起来,构成整数100的编码。编码的最后结果存储起来,供解码函数读取解码。现在讨论,数据值编码结果以何种方式存储。u 方式一:链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。缺点:内存的申请管理比较麻烦,编码结果无法保存下来,供下次调用优点:用链表存储编码结果,可以随编码结果占用空间的大小,动态申请非顺序的内存块,而不必像数组那样定义固定的内存空间,对存储空间的利用率较高,另外,链表申请的空间,只要内存有空闲,就不会产生溢出。u 方式二:数组数组,在C语言里,是一种物理存储单元上连续的、顺序的存储结构,数据元素按照出现的顺序存储到数组里。缺点:数组需要定义固定的长度,不适应动态增减的情况,当数据过多,会造成内存溢出,数据过少,又造成内存浪费。优点:数组分配连续的一块内存区域,操作方便快捷。u 方式三:文件如果编码的数据有多个,为了方便编码结果的重复应用,节省编码的开支,引入文件,对各个编码结果永久保存起来,解码的时候,只需要读取保存的编码文件,就可以完成解码工作。缺点:保存速度慢,依赖于外存储器,如硬盘。优点:可以永久保存,可以重复应用编码结果,操作方便。u 结论分析:通过上述存储方式优缺点的比较,本文选取数组跟文件的方式,共同完成对编码结果的处理工作。数组完成单次编码中间结果的保存工作,简单快捷,也不会浪费空间;文件完成单次编码结果后数据的保存工作。2.2 布尔值布尔值的编码是原始编码。内容八位位组由单个八位位组组成。布尔值为:TRUE,八位位组编码为非0值;布尔值为FALSE,八位位组编码为0值。具体编码情况见表2-3。表2-3 布尔值的编码布尔值标识符编码长度编码内容编码TRUE01160116FF16FALSE0116011600162.3 整数值和枚举值1、整数值整数值的编码是原始编码,内容八位位组由一个或多个八位位组组成,其值可以是正数,负数和0,具有任意大小,本文对整数值的编码最大值约定为占用4字节。其范围为:-231231-1。整数值的编码规则:1) 内容八位位组应是整数值的对2的补码的二进制数;2) 第一个八位位组与第二个八位位组的位8,应不全为1且不全为0。整数值的标识符编码:标识符固定为0216。整数值的长度编码:根据整数值的内容占用字节数,由2.1.2所述规则编码。整数值的内容编码算法:整数值的编码,可以采用字符串法和除数法,现在分析比较两种算法的特点:u 方式一:字符串法若整数为正数,则直接把该整数转换为对应的二进制形式的字符串,然后计数字符串的位数,按照八位为一字节的原则,对该字符串处理分割,不足八位的,前面补0凑足八位,超过八位的,分割出八位,余下的再补0凑足八位;若整数为负数,则先对该整数求取绝对值,按照正数的方式求其二进制形式的字符串,对二进制字符串取反(1换成0,0换为1)加1求得该数的二进制补码,按照八位一字节的原则,对字符串分割处理(同正数)。u 方式二:除数法由于编码是以字节为单位的,一个字节有八比特位,八位都为1时,对应的整数为255。所以对该整数编码,可以先用该整数除以256,直到商为0,每除一次,计数器加1,该计数器即为内容八位位组的八位位组个数,其内容为111111112。对商为0前的余数编码(整数对应的二进制数),加上前面的编码内容,即为该整数的内容编码结果。u 结论分析:采用字符串法对整数值编码,显得稍微复杂,但是其结构明了,有利于长度八位位组的编码计算,同时与其他类型的数据编码具有共性,故可以重复利用其编码函数,所以这里采用字符串法对整数内容进行编码。下面,列出一些典型的整数值编码实例,见表2-4。表2-4 整数值的编码整数值标识符编码长度编码内容编码0021601160016127021601167E161280216021600 80161290216021600 8116-127021601168116-128021601168016-12902160216FF 7F162、枚举值枚举值的编码,实际上是与之对应的整数值的编码,其规则同整数值的规则一样,这里不再赘述。2.4 实数值2.4.1 实数值的编码规则实数值编码是原始编码,八位位组标识符为0916,长度编码根据内容编码占用的字节及2.1.2的规则确定,内容编码部分,根据值的大小,其编码分三种情况讨论:u 情形一:实数值为0,编码中没有内容八位位组。内容编码如下所示:00001001 000000002u 情形二:实数值为无穷,则应只有一个内容八位位组,内容编码如下:010000002 值为PLUS-INFINITY(无穷大)010000012 值为MINUS-INFINITY(无穷小)u 情形三:实数值为其他值,下面讨论这种情况。1) 若抽象值的基数为10,则第一个内容八位位组的位8=0,位7=0,位6至位1规定如表2-5所示。表2-5 十进制编码位6至位1编码说明位6至位1数字表示00 0001SJ/Z 9047 NR100 0010SJ/Z 9047 NR200 0011SJ/Z 9047 NR3位6至位1中剩余的值为保留部分,跟在第一个内容八位位组之后的内容八位位组部分则按照SJ/Z 9047-1987的规定进行编码。2) 若抽象值的基数为2,8或16,则按二进制的方式对内容编码。第一个内容八位位组的位8至位1各部分说明如图2-3所示。图2-3 实数值第一个内容八位位组说明剩余的内容八位位组将整数N的值编码为无符号二进制数。2.4.2 实数值的精度根据IEEE-754国际标准,常用的浮点数有两种格式,即单精度浮点数和双精度浮点数。IEEE754规定,单精度浮点数用4字节存储,双精度浮点数用8字节存储,分为三个部分:符号位、阶和尾数。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位,符号位1位,双精度则有11位阶码,53位尾数和1位符号位。下表2-6列出单精度跟双精度的存储结构。表2-6 单精度/双精度存储结构浮点数格式符号位阶码尾数表示数的范围单精度1位8位23位3.4E-383.4E+38双精度1位11位52位1.79E-3081.79E+308在C/C+编译器中,单精度浮点数对应float型实数,双精度浮点数对应double型实数。所以对于实数值的编码,本文采用两种不同宽度的编码方式,即单精度编码和双精度编码。下面举例讨论C语言中,float型和double型是如何在计算机中存储表示的。单精度浮点数,举例说明其存储结构,有一单精度浮点数4.25,则它在计算机中的存储方式如图2-4所示。4.25转换为二进制数为100.01,写成科学计数法为1.0001*22。分解如下:为正数,故符号位为0;指数部分为2;尾数为0001。最终单精度浮点数4.25在计算机中存储的二进制结果为:0 1000 0001 000 1000 0000 0000 0000 0000。图2-4 Float型数据在计算机中的存储方式双精度浮点数,跟单精度浮点数具有类似的存储结构,它所表示的范围更广,占用的字节数为8个,计算精度更高,这里不作讨论。2.4.3 实数值的编码算法实数值的标识符编码:实数值是原始编码,标识符编码为:0916。实数值的长度编码:它取决于实数值内容编码占用的字节数,参照2.1.2长度编码的规则,对实数值长度进行编码。实数值的内容编码:实际上是对实数值尾数M,符号S及指数的计算。下面分析讨论两种对实数值编码的方法。u 方法一:由ASN.1 BER实数值编码规则可知,其内容编码与实数值在计算机中的存储结构相似(参见2.4.2节图2-4),所以我们只要找出计算机中存储的该实数的符号S,尾数M及其指数P,然后把它们转换为符合ASN.1 BER实数值编码规则的结构,就完成了对实数值的编码。u 方法二:对一个二进制表示的实数,先对该数进行移位,向左或向右移P位,直到该数符合科学计数法的表示方法,即整数部分为1,后接小数点跟小数位。这时编码的指数就是P或-P,小数点后面的就是该实数的尾数M,如果该数是正数,则S为-1,否则为+1。求得了尾数M,指数P,符号位S,按照实数值编码规则,对实数进行编码。u 结论分析:方法一的编码方式,依赖于计算机跟操作系统的支持,当代码移植到其他平台或缺少操作系统的平台,或者不是IEEE754规范的硬件平台就无法正确编码解码了,局限性比较大。方法二的编码方式,采用移位方式完成指数,尾数的计算,代码容易移植,编码具有一般性,但是具体操作没方法一的结构清晰,可理解性稍差。综合比较分析上述两种方法,本文尝试采用上述两种方式对实数值编码。单精度编码采用方法二,双精度编码采用方法一。单精度编码,指数位(8位)占用一个字节编码;双精度编码,指数位(11位)占用两个字节编码。下表2-7,列举几个单精度编码示例。表2-7 单精度编码示例实数值标识符编码长度编码内容编码-109160316C0 00 0016009160016无10916031680 00 0016无穷大091601164016无穷小0916011641162.5 位串值位串值的编码是原始编码,或是结构化编码。当整个位串可用之前有必要传送部分位串时,使用结构化编码。位串值标识符编码:原始编码0316;结构化编码2316。位串值长度编码:原始编码根据内容编码占用字节数计算;结构化编码整个长度编码是所有单独部分占用字节数的总和,另外加内容结束八位位组标志0016。位串值编码规则:1) 原始编码,包含一个初始八位位组,后随0,1或多个后继八位位组。初始八位位组应编码最后一个后继八位位组未使用的数,范围:0至7。2) 结构化编码,将编码分段,除最后一个段,每个段应包含8的整数倍的位数,每个段都有完整的编码,包括标识符、长度和内容编码。位串值内容编码算法:u 原始编码算法:对于输入的位串值(若输入十六进制,则先把十六进制转换为二进制),计算位串的长度,对8取余,余数即为初始八位位组需要编码的位数,把余数编码为无符号二进制数,然后连接输入的位串值,构成位串值内容八位位组。u 结构化编码算法:对输入的位串值分段,每段都按照原始编码的处理方法处理,最后把每段内容编码连接起来构成最后的内容编码结果。下面举例说明,采用原始编码对位串值编码的结构形式(见表2-8)和采用结构化编码方式位串值的编码结构形式(见表2-9)。表2-8 采用原始编码的位串值编码示例位串值标识符编码长度编码内容编码09BFA2C160316051604 09 BF A2 C01601020316021605 4016表2-9 采用结构化编码的位串值编码示例位串值标识符编码长度编码内容编码0A3B5F291CD(十六进制)23160C16标识符编码长度编码内容编码0316031600 0A 3B160316051604 5F 29 1C D016EOC长度001600162.6 八位位组串值八位位组串值的编码是位串值编码的特例,与位串值编码相比,具有如下特点:1) 八位位组串值,编码的数据值包含8的整数倍的位数,所以八位位组串值的编码不包含初始八位位组;2) 八位位组串值的标识符为:0416,也可以采用原始编码和结构化编码两种方式进行编码。八位位组串值的编码,与位串值编码类似,这里就不再单独讨论八位位组串值的编码算法了,具体编码可以参照2.5位串值的编码。下面给出采用原始编码方式的位串值/八位位组串编码比较,见表2-10。表2-10 采用原始编码方式的位串值/八位位组串编码比较编码串数据类型标识符编码长度编码内容编码FF(十六进制)位串值0316021600 FF16八位位组串值04160116FF162.7 空值空值标识符编码:空值的编码是原始编码,标识符为:0516。空值长度编码:0016。空值内容编码:不包含任何八位位组。所以对空值的编码,其完整编码如下表2-11所示:表2-11 空值的编码空值标识符编码长度编码内容编码NULL05160016无2.8 结构化值2.8.1 序列值序列值编码是结构化编码,标识符编码为:3016。序列值长度编码:序列值的长度由编码内容的占用的字节数决定,它应该包含序列值内容编码所有内容的长度(包括其他数据类型的完整编码,标识符,长度,内容)。序列值编码规则:1) 内容八位位组,由前面所描述的各种原始编码或结构化编码组成,每个数据类型的编码都是一个完整编码(包含标识符,长度和内容)。2) 每种数据类型的编码,应该按照出现定义的次序编码,除非带有关键字:OPTIONAL或者DEFAULT,带上关键字的数据值可以出现,也可以不出现。序列值的编码算法:序列值的编码,实际上是对布尔值、整数值、实数值、位串值、八位位串值、空值等原始编码或结构化编码的调用,所以在处理序列值编码时,本文定义一些关键字,用以识别前几节论述的数据类型,根据关键字,调用相应的编码处理函数,就可以完成序列值的编码。下面举例说明,见表2-12。表2-12 序列值编码示例序列值标识符编码长度编码内容编码布尔值:TRUE整数值:100实数值:20.2530160C16标识符编码长度编码内容编码01160116FF16标识符编码长度编码内容编码021601166416标识符编码长度编码内容编码0916041681 00 04 4416所以,该序列值的完整编码为:30 0C 01 01 FF 02 01 64 09 04 81 00 04 4416。2.8.2 单一序列值单一序列值,是序列值的特殊情况,单一序列值的编码也是结构化编码,它跟序列值编码具有类似的规则,具有次序。现在说明他们的区别:1) 序列值,一次编码可以有多种数据值类型,可以使用结构化嵌套。如表2-12所列,一次可以编码布尔值,整数值和实数值;2) 单一序列值,一次编码只能编码若干个相同类型的数据值,它不可以同时编码不同的数据类型,它的编码模式是:实数值1,实数值2实数值n。单一序列值的编码实现同序列值一样,这里不再阐述。2.8.3 集合值集合值的编码是结构化编码,标识符编码为:3116。集合值的编码与序列值编码类似,这里阐述其区别:1) 序列值编码是按照各种数据类型出现的顺序编码的,而集合值的编码,不必按照数据值出现的顺序进行编码,对传送期间的次序也没有限制;2) 对带有关键字OPTIONAL或DEFAULT的数据值,它的编码可以出现,也可以不出现,对没有关键字的数据,按照发送器选定的次序出现。如表2-12所示,如果集合值编码这三个数据值,则它可以编码为下面情况:31 0C 01 01 FF 02 01 64 09 04 81 00 04 441631 0C 09 04 81 00 04 44 01 01 FF 02 01 6416上面两种方式都正确,数据值编码的出现不必遵从数据值的出现次序。2.8.4 单一集合值单一集合值是集合值的特殊情况,跟序列值/单一序列值的关系是一样的,它也是结构化编码,单一集合值的的标识符跟集合值相同:3116。单一集合值的编码及后续解码,都不必保持数据值的次序,它编码的模式是:实数值1,实数值2实数值n。其他具体编码算法跟集合值一致,这里不再阐述。2.8.5 选择值选择值的编码应与被选择的类型值编码相同,用于标识八位位组的标签是被选择的类型的标签。选择值编码可以是原始编码,也可是是结构化编码,具体编码取决于选择的数据值编码算法。2.9 本章小结ASN.1 BER的数据值的编码,一般有三部分组成:标识符八位位组,长度八位位组和内容八位位组。本章从这三部分出发,先后简单介绍了几种原始数据值类型和结构化数据值的编码规则。本章介绍的原始类型有:布尔值,整数值,实数值,位串值,八位位串值和空值;结构类型有:序列值,单一序列值,集合值,单一集合之和选择值。本章还着重介绍了各种数据值的编码算法,分析比较了几种算法的特点,及确定了在具体编码环节中,选取何种方法,按照ASN.1 BER的规则,对数据值进行编码,为后续章节的实现过程,奠定了理论基础。第三章 基于ASN.1 BER规约的编码实现第三章 基于ASN.1 BER规约的编码实现前面的章节,已经对ASN.1 BER规约做了详细的介绍,并分析讨论了各数据值类型的编码算法比较,本章将按照选定的算法开始对数据值进行编码,包括数据值编码流程图,数据值的编码结果等。3.1 布尔值的编码布尔值的编码由三部分构成,标识符,长度和内容。其中标识符和长度都是固定的值,内容编码时,判断输入的布尔值是TRUE还是FALSE,是TRUE则编码为FF16,是FALSE则编码为0016。布尔值的编码流程图见图3-1。图3-1 布尔值编码流程图按照图3-1所示流程图,编写出完整的布尔值编码程序。下图3-2是布尔值编码程序运行的截图。程序编码结果显示的方式,有十六进制和二进制,其与具体的编码规则无关,它的转换程序这里就不讨论了。图3-2 布尔值的编码结果3.2 整数值和枚举值的编码整数值的编码有三部分组成:标识符,长度和内容。ASN.1 BER编码规则中,标识符都是固定的值,编码的最后直接加上标识符,就是最后的编码结果,这里包括后续章节,对标识符均不再阐述。下面讨论长度编码和整数值内容编码。u 长度编码ASN.1 BER中所讨论的数据值,都涉及到长度的编码,长度八位位组的编码规则,在第二章已经详细阐述过,这里讨论长度八位位组的编码函数具体实现。图3-3 长度编码处理函数流程图思路:在内容八位位组编码完毕后,读取内容八位位组编码的长度N,把N编码为无符号的二进制数。图3-3给出长度编码处理函数的流程图。在以后的各种数据值中,有长度编码时,只需要调用此处的长度编码处理函数,就可以完成长度的编码计算。从而节省代码编写的工作量,提高代码的利用率。u 整数值内容编码整数值内容八位位组的编码,采用字符串法。具体实现过程如下:输入一个整数,判断该数是正数还是负数,若为正数,则直接把该数转换为二进制字符串,然后计算该字符串长度,在字符串前补0使得字符串位数是8的整数倍。若为负数,则先求得其绝对值,按照正数方法进行字符串编码,取反+1,求得其二进制补码形式的字符串,最后对字符串补0,使得其位数是8的整数倍。下图3-4是整数值内容编码的流程图。图3-4 整数值内容编码流程图按照整数值内容编码流程图3-4,和长度编码处理函数流程图3-3,编写出完整的整数值编码程序。图3-5是整数值编码程序的运行结果截图。图3-5 整数值编码结果u 枚举值编码枚举值的编码是与之相关的整数值的编码,其具体编码程序跟整数值编码函数可以一样,这里不再另外编码。3.3 实数值的编码实数值的编码规则比较复杂,需要编码的情形比较多。无穷大,无穷小,0值,这三个数值的内容编码固定,这里不作分析讨论,具体的编码时,超出实数值精度最大数的数值编码为无穷大,小于实数值精度最小值的数值编码为无穷小,下面讨论分析实数值为可编码的一般情况。3.3.1 实数值编码分析实数值的标识符编码为:0916。长度编码见图3-3,调用长度编码处理函数,这里不再作详细介绍。对实数值的内容编码,本文采用二进制的方法统一编码。图3-6是实数值编码函数的流程图。图3-6 实数值编码流程图实数值的编码有十进制编码和二进制编码,本文只讨论二进制编码方式,对输入的十进制实数,先把十进制转换为二进制,然后用二进制编码方式对实数值编码。实数值内容编码有单精度编码和双精度编码,本文分别用不同的方法对单精度浮点数和双精度浮点数进行编码。使用二进制编码时,该实数的组成如下:M = S * N * 2F M为尾数N为一个非负整数0 = F 4 F为二进制比例因子S= +1 或 -1 S为符号位,S = -1,则位7为1,否则为03.3.2 单精度浮点数编码单精度编码,符号位为S,占一位,在第一个字节第二位体现;指数位P为8位,占一个字节;尾数位M最多保留23位。对实数值的编码,实际上是对S,P和M的求解。图3-7是单精度浮点数编码函数流程图。图3-7 单精度编码函数处理流程图根据单精度编码函数处理流程图(图3-7),编写出单精度编码函数,结合实数值编码流程图(图3-6),编写出完整的实数值编码程序,程序运行结果截图见图3-8。图3-8 单精度浮点数编码结果3.3.3 双精度浮点数编码双精度编码,符号位S,占一位,在第一个字节第二位体现;指数位P有11位,占用两个字节编码;尾数M最多保留52位。下面采用第二章讨论的方式,对双精度浮点数进行编码,图3-9是双精度浮点数编码流程图。图3-9 双精度编码函数处理流程图双精度编码可以采用单精度编码的方式进行编码,只是保留的尾数位更多,精度更高,范围更大。根据双精度编码函数处理流程图,编写出完整的双精度浮点数编码程序,图3-10是双精度浮点数编码的结果截图。图3-10 双精度浮点数编码结果3.4 位串值的编码位串值的编码有原始编码和结构化编码,本文选取原始编码类型对位串值编码。位串值的标识符为0316。位串值的长度编码调用长度编码处理函数(见3.2节)。位串值的内容编码编码算法跟规则,前面已经讨论,图3-12给出位串值编码流程图。图3-11给出位串值编码结果截图。图3-11 位串值编码结果根据图3-12位串值内容编码流程图,编写出完整的位串值编码程序。输入的方式有十六进制跟二进制两种方式,图3-11给出的是以二进制方式输入的位串值编码结果,十六进制输入方式的编码结果,跟二进制一样,具体运行参见程序。图3-12 位串值内容编码流程图3.5 八位位组串值的编码八位位组串值的编码也有原始编码和结
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 业务流程梳理与再造框架
- 子宫肌瘤及子宫腺肌病子宫动脉栓塞术治疗专家共识解读 2
- 奥鹏课件点击截止时间
- 商业活动策划执行与场地租赁合同书补充协议
- 日记美食300字14篇范文
- 生活是丰富多彩的作文(8篇)
- 《闭经诊断与治疗指南(2023版)》解读
- 化工厂安全培训宣传课件
- 大龙中队消防安全培训课件
- 化工化验安全培训课件
- 国际贸易理论与实务ppt课件(完整版)
- GB∕T 6546-2021 瓦楞纸板边压强度的测定
- 历史选择性必修1 国家制度与社会治理(思考点学思之窗问题探究)参考答案
- 中国铁路总公司《铁路技术管理规程》(高速铁路部分)2014年7月
- 学前儿童发展心理学(第3版-张永红)教学课件1754
- 医学资料冠心病英文版
- 部编人教版九年级语文上册教学计划及教学进度表
- 干法——稻盛和夫
- 人教版数学八年级上册12.2 :三角形全等的判定(“角边角”“角角边”定理)》课件(共26张PPT)
- 城市垃圾焚烧发电处理讲解
- 乳铁蛋白与骨质疏松症
评论
0/150
提交评论