版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 基于ASN.1 BER規(guī)約的編解碼系統(tǒng)設(shè)計(jì)</p><p><b> 摘要</b></p><p> ASN.1是一種高級(jí)抽象語(yǔ)法標(biāo)記語(yǔ)言,在任何需要以數(shù)字方式發(fā)送信息的地方,ASN.1都可以發(fā)送各種形式的信息(聲頻、視頻、數(shù)據(jù)等),它以一種獨(dú)于計(jì)算機(jī)架構(gòu)和語(yǔ)言的方式來(lái)描述數(shù)據(jù)。BER是ASN.1中的基本編碼規(guī)則,它描述具體的ASN.1對(duì)象如
2、何編碼成比特流在網(wǎng)絡(luò)上進(jìn)行傳輸,數(shù)據(jù)首先經(jīng)過(guò)BER編碼,再經(jīng)由傳輸層協(xié)議發(fā)送到接收方,接收方在相應(yīng)的端口收到數(shù)據(jù)包后,經(jīng)過(guò)BER解碼,得到具體的操作數(shù)據(jù)。本文的主要工作就是設(shè)計(jì)實(shí)現(xiàn)一個(gè)基于ASN.1 BER規(guī)約的編解碼系統(tǒng)。</p><p> 本文分析比較了ASN.1定義的數(shù)據(jù)值編碼算法。開(kāi)始部分對(duì)BER編碼規(guī)則進(jìn)行比較詳細(xì)的分析,按照標(biāo)識(shí)符八位位組,長(zhǎng)度八位位組,內(nèi)容八位位組的編碼結(jié)構(gòu),討論比較編碼的各種算法
3、及其特點(diǎn),并由此確定本文數(shù)據(jù)值編碼環(huán)節(jié)中所采用的編碼算法。由ASN.1 BER定義的數(shù)據(jù)值編碼的算法,設(shè)計(jì)出各種數(shù)據(jù)值編碼程序的流程圖,用C/C++程序設(shè)計(jì)語(yǔ)言,在Microsoft Visual C++ 6.0環(huán)境下編寫(xiě)編碼程序。在編寫(xiě)出完整的編碼程序后,運(yùn)行測(cè)試程序,給出相應(yīng)的數(shù)據(jù)值編碼結(jié)果截圖,驗(yàn)證編碼算法的正確性。</p><p> 本文成功實(shí)現(xiàn)了一個(gè)基于ASN.1 BER規(guī)約的可視化編解碼通信系統(tǒng)。在
4、VC(MFC)平臺(tái)下,基于已實(shí)現(xiàn)的數(shù)據(jù)值編碼模塊和解碼模塊,使用UDP協(xié)議,簡(jiǎn)單模擬兩臺(tái)計(jì)算機(jī)通過(guò)ASN.1 BER規(guī)約,編碼、傳輸、解碼數(shù)據(jù)。所設(shè)計(jì)的編解碼可視化通信系統(tǒng),在一定程度上模擬了ASN.1在表示層的具體應(yīng)用。</p><p> 關(guān)鍵詞:ASN.1,BER,編碼,算法,可視化編程</p><p> Design of Encoding and Decoding System
5、 Based on ASN.1 BER</p><p><b> Abstract</b></p><p> ASN.1--Abstract Syntax Notation One--is a high-level language, which can send information in various forms, such as audio, vide
6、o, 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 spec
7、ific 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</p><p> This paper analyzes and compares the data va
8、lue 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 oc
9、tet, 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 char
10、t according to t</p><p> 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, t
11、his 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 syste
12、m designed in this paper, to a certain extent, is a simulation of ASN.1 specific application in the</p><p> Keywords: ASN.1, BER, Encoding, Algorithm, Visual programming</p><p><b> 目錄<
13、;/b></p><p><b> 摘要I</b></p><p> AbstractII</p><p><b> 目錄III</b></p><p><b> 第一章 緒論1</b></p><p> 1.1 ASN.1
14、BER規(guī)約概述1</p><p> 1.2 ASN.1 BER規(guī)約的應(yīng)用與發(fā)展前景2</p><p> 1.3 本文內(nèi)容和結(jié)構(gòu)安排3</p><p> 第二章 ASN.1 BER的編碼算法4</p><p> 2.1 ASN.1 BER數(shù)據(jù)值的編碼組成4</p><p> 2.1.1 標(biāo)識(shí)
15、符八位位組4</p><p> 2.1.2 長(zhǎng)度八位位組5</p><p> 2.1.3 內(nèi)容八位位組6</p><p> 2.1.4 內(nèi)容結(jié)束八位位組6</p><p> 2.1.5 數(shù)據(jù)值編碼結(jié)果的存儲(chǔ)方式6</p><p> 2.2 布爾值7</p><p>
16、; 2.3 整數(shù)值和枚舉值7</p><p> 2.4 實(shí)數(shù)值9</p><p> 2.4.1 實(shí)數(shù)值的編碼規(guī)則9</p><p> 2.4.2 實(shí)數(shù)值的精度10</p><p> 2.4.3 實(shí)數(shù)值的編碼算法11</p><p> 2.5 位串值12</p><
17、p> 2.6 八位位組串值13</p><p> 2.7 空值13</p><p> 2.8 結(jié)構(gòu)化值13</p><p> 2.8.1 序列值13</p><p> 2.8.2 單一序列值14</p><p> 2.8.3 集合值14</p><p>
18、 2.8.4 單一集合值15</p><p> 2.8.5 選擇值15</p><p> 2.9 本章小結(jié)15</p><p> 第三章 基于ASN.1 BER規(guī)約的編碼實(shí)現(xiàn)16</p><p> 3.1 布爾值的編碼16</p><p> 3.2 整數(shù)值和枚舉值的編碼17</
19、p><p> 3.3 實(shí)數(shù)值的編碼19</p><p> 3.3.1 實(shí)數(shù)值編碼分析19</p><p> 3.3.2 單精度浮點(diǎn)數(shù)編碼21</p><p> 3.3.3 雙精度浮點(diǎn)數(shù)編碼22</p><p> 3.4 位串值的編碼23</p><p> 3.5 八
20、位位組串值的編碼24</p><p> 3.6 空值的編碼25</p><p> 3.7 結(jié)構(gòu)化編碼27</p><p> 3.7.1 序列值的編碼27</p><p> 3.7.2 單一序列值的編碼29</p><p> 3.7.3 集合值的編碼29</p><p&
21、gt; 3.7.4 單一集合值的編碼30</p><p> 3.8 編碼系統(tǒng)30</p><p> 3.8.1 編碼系統(tǒng)的設(shè)計(jì)說(shuō)明30</p><p> 3.8.2 編碼系統(tǒng)設(shè)計(jì)流程圖31</p><p> 3.8.3 編碼系統(tǒng)運(yùn)行結(jié)果32</p><p> 3.9 本章小結(jié)34&l
22、t;/p><p> 第四章 基于ASN.1 BER規(guī)約的可視化編解碼系統(tǒng)及通信35</p><p> 4.1 ASN.1 BER 可視化編解碼系統(tǒng)35</p><p> 4.2 編解碼系統(tǒng)通信的實(shí)現(xiàn)36</p><p> 4.3 編解碼通信系統(tǒng)功能擴(kuò)展39</p><p> 4.4 編解碼通信系
23、統(tǒng)測(cè)試40</p><p> 4.5 本章小結(jié)44</p><p> 第五章 總結(jié)45</p><p> 5.1 主要內(nèi)容回顧45</p><p> 5.2 本次設(shè)計(jì)的不足和進(jìn)一步的完善45</p><p><b> 致謝47</b></p><p
24、><b> 參考文獻(xiàn)48</b></p><p> 附錄A High-performance ASN.1 compiler49</p><p> 附錄B 高性能的ASN.1編譯器55</p><p><b> 第一章 緒論</b></p><p> 1.1 ASN.1
25、BER規(guī)約概述</p><p> ASN.1(Abstract Syntax Notation One)是一種抽象語(yǔ)法標(biāo)記語(yǔ)言,它通過(guò)定義若干個(gè)簡(jiǎn)單類型和由簡(jiǎn)單類型復(fù)合而成的結(jié)構(gòu)類型,在表示層用一致的形式來(lái)表示應(yīng)用層的復(fù)雜多樣的數(shù)據(jù),便于異構(gòu)系統(tǒng)間的通信。ASN.1是一種ISO/ITU-T 標(biāo)準(zhǔn),描述了一種對(duì)數(shù)據(jù)進(jìn)行表示、編碼、傳輸和解碼的數(shù)據(jù)格式。它提供了一整套正規(guī)的格式用于描述對(duì)象的結(jié)構(gòu),而不管語(yǔ)言上如何執(zhí)
26、行,也不用去管到底是什么樣的應(yīng)用程序。BER(Basic Encoding Rules)是ASN.1的基本編碼規(guī)則,它是一種傳送語(yǔ)法,它可以把復(fù)雜的用抽象語(yǔ)法描述的數(shù)據(jù)結(jié)構(gòu)表示成簡(jiǎn)單的數(shù)據(jù)流,從而方便數(shù)據(jù)的傳送。它是描述怎么把一個(gè)ASN.1類型的值表達(dá)或編碼為8位字位串的字節(jié)串。在通信系統(tǒng)中,為了讓通信雙方對(duì)通信媒介中傳輸?shù)男畔a(chǎn)生一致的理解,通信雙方就必須明確所交換信息的類型與格式規(guī)范。而ASN.1 BER規(guī)約就是用來(lái)明確交換信息的一
27、種類型和格式規(guī)范。</p><p> ASN.1 BER的編解碼分為原始編解碼和結(jié)構(gòu)化編解碼。原始編解碼數(shù)據(jù)值有:布爾值、整數(shù)值、枚舉值、實(shí)數(shù)值、位串值、八位位組串值和空值;結(jié)構(gòu)化編碼數(shù)據(jù)值有:序列值、單一序列值、集合值、單一集合值等。無(wú)論是原始類型還是結(jié)構(gòu)化類型,它們都遵循一致的編碼結(jié)構(gòu)。</p><p> ASN.1 BER的編碼結(jié)構(gòu)如圖1-1所示,替換的結(jié)構(gòu)化編碼如圖1-2所示。
28、</p><p> 圖1-1 編碼結(jié)構(gòu)</p><p> 圖1-2 替換的結(jié)構(gòu)化編碼</p><p> 根據(jù)BER編解碼規(guī)則,數(shù)據(jù)對(duì)象的編解碼有標(biāo)識(shí)段、長(zhǎng)度字段和值字段三部分組成。標(biāo)識(shí)符字段用于識(shí)別傳輸字節(jié)串值的數(shù)據(jù)類型,由值的標(biāo)簽類別、值的編解碼方式和標(biāo)簽值組成;長(zhǎng)度字段指明值中八位位組的數(shù)目;值字段是對(duì)值本身的編碼,在原始編碼中,該字段表示數(shù)據(jù)的實(shí)際值
29、,而在結(jié)構(gòu)化編碼中該字段是一個(gè)或多個(gè)數(shù)據(jù)的完整編碼形式(包括標(biāo)識(shí)符字段,長(zhǎng)度字段和值字段)。</p><p> ASN.1以一種高度抽象的形式表示數(shù)據(jù)結(jié)構(gòu)信息,與其他表示語(yǔ)言相比,它具有如下特點(diǎn):</p><p> 1、ASN.1與具體的平臺(tái)與編程語(yǔ)言無(wú)關(guān),為數(shù)據(jù)類型(例如:整形,實(shí)數(shù),比特,字符串)的定義提供了一種和實(shí)現(xiàn)無(wú)關(guān)的機(jī)制。</p><p> 2、A
30、SN.1使用了對(duì)象的概念,對(duì)象是定義為具有類型和值的信息實(shí)體,可以很容易從一種格式翻譯成另一種格式,使用相應(yīng)得ASN.1工具可以將ASN.1描述的結(jié)構(gòu)化信息映射成某種語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)表示形式。</p><p> 3、在數(shù)據(jù)傳輸時(shí),ASN.1提供了相應(yīng)的編碼規(guī)則,可以利用工具生成的編解碼函數(shù)將數(shù)據(jù)結(jié)構(gòu)自動(dòng)轉(zhuǎn)換為傳輸所需要的位模式。</p><p> 4、ASN.1提供了比普通編程語(yǔ)言更豐富
31、的數(shù)據(jù)結(jié)構(gòu),支持以簡(jiǎn)單成員構(gòu)建任意復(fù)雜結(jié)構(gòu),支持嵌套結(jié)構(gòu)以及嵌套結(jié)構(gòu)任意深度從而滿足特殊需要。因?yàn)锳SN.1表示數(shù)據(jù)的能力比普通編程語(yǔ)言強(qiáng)的多,越復(fù)雜的描述信息則越能體現(xiàn)出ASN.1的優(yōu)越性。</p><p> 5、ASN.1 的編碼方法比許多與之相競(jìng)爭(zhēng)的標(biāo)記系統(tǒng)更先進(jìn),它支持可擴(kuò)展信息快速可靠的傳輸,在無(wú)線寬帶中,這是一種優(yōu)勢(shì)。</p><p> 1.2 ASN.1 BER規(guī)約的應(yīng)
32、用與發(fā)展前景</p><p> 在任何需要以數(shù)字方式發(fā)送信息的地方,ASN.1 都可以發(fā)送各種形式的信息(聲頻、視頻、數(shù)據(jù)等等)。ASN.1和特定的ASN.1編碼規(guī)則推進(jìn)了結(jié)構(gòu)化數(shù)據(jù)的傳輸,尤其是網(wǎng)絡(luò)中應(yīng)用程序之間的結(jié)構(gòu)化數(shù)據(jù)傳輸,它以一種獨(dú)立于計(jì)算機(jī)架構(gòu)和語(yǔ)言的方式來(lái)描述數(shù)據(jù)結(jié)構(gòu)。</p><p> 今天在實(shí)際中已有大量應(yīng)用,這些應(yīng)用包括:</p><p>
33、 1、GSM系統(tǒng)——空中接口上傳遞的補(bǔ)充業(yè)務(wù)內(nèi)容采用了ASN.1的BER編碼格式,其RRM模塊以及其他層消息均采用CSN.1編碼。 </p><p> 2、變電站通信——在電力系統(tǒng),鐵路供電系統(tǒng)中,按照變電站通信網(wǎng)絡(luò)和系統(tǒng)系列標(biāo)準(zhǔn)IEC61850應(yīng)用層消息結(jié)構(gòu)與ASN.1之間的對(duì)應(yīng)關(guān)系,設(shè)計(jì)ASN.1編解碼模塊,實(shí)現(xiàn)變電站自動(dòng)化通信系統(tǒng)。</p><p> 3、IP語(yǔ)音——在通信領(lǐng)域中
34、的另一個(gè)重要應(yīng)用是通過(guò)包轉(zhuǎn)換網(wǎng)絡(luò)(如因特網(wǎng))傳遞語(yǔ)音數(shù)據(jù)。多媒體數(shù)據(jù)信號(hào)編解碼器(CODEC)標(biāo)準(zhǔn)(H.323等等)基于ASN.1并且使用于分組編碼標(biāo)準(zhǔn)來(lái)獲取理想的數(shù)據(jù)傳輸速率。 </p><p> 4、安全應(yīng)用——因特網(wǎng)安全授權(quán)同樣也使用了ASN.1。高級(jí)編碼標(biāo)準(zhǔn)在數(shù)據(jù)表示方面形成了一個(gè)方便的、平臺(tái)無(wú)關(guān)的標(biāo)準(zhǔn),比加密要優(yōu)越。PKIX、PKCS和X.509等標(biāo)準(zhǔn)也是基于ASN.1的。</p>&l
35、t;p> 1984年,ASN.1 就已經(jīng)成為了一種國(guó)際標(biāo)準(zhǔn),它的編碼規(guī)則已經(jīng)成熟并在可靠性和兼容性方面擁有更豐富的歷程。在變電站通信系統(tǒng),GSP系統(tǒng),移動(dòng)3G系統(tǒng),信息安全等方面已經(jīng)有了廣泛的應(yīng)用,隨著信息技術(shù)的發(fā)展,ASN.1將會(huì)有更加廣闊的空間。 </p><p> 1.3 本文內(nèi)容和結(jié)構(gòu)安排</p><p> 本文根據(jù)ASN.1的基本編碼規(guī)則,設(shè)計(jì)編寫(xiě)一個(gè)編解碼系統(tǒng)。論
36、文共有五章,各章的主要內(nèi)容安排如下:</p><p> 第一章簡(jiǎn)要概述ASN.1 BER規(guī)約的特點(diǎn),當(dāng)前應(yīng)用和發(fā)展前景,簡(jiǎn)單介紹了ASN.1 基本編碼規(guī)則的編碼結(jié)構(gòu)。</p><p> 第二章分析ASN.1 BER的基本編碼規(guī)則,照標(biāo)識(shí)符八位位組,長(zhǎng)度八位位組,內(nèi)容八位位組的編碼結(jié)構(gòu),討論比較數(shù)據(jù)值編碼的各種算法及其特點(diǎn),并由此確定本文數(shù)據(jù)值編碼環(huán)節(jié)中所采用的編碼算法。</p&g
37、t;<p> 第三章設(shè)計(jì)數(shù)據(jù)值編碼程序的流程圖,使用C/C++程序設(shè)計(jì)語(yǔ)言,在Microsoft Visual C++ 6.0環(huán)境下編寫(xiě)編碼程序,運(yùn)行測(cè)試程序,給出相應(yīng)的數(shù)據(jù)值編碼結(jié)果截圖,驗(yàn)證編碼算法的正確性。</p><p> 第四章使用MFC,設(shè)計(jì)基于ASN.1 BER的編解碼可視化系統(tǒng), 通過(guò)UDP協(xié)議,簡(jiǎn)單模擬兩臺(tái)計(jì)算機(jī)應(yīng)用ASN.1 BER規(guī)約,編碼、傳輸、解碼數(shù)據(jù)的過(guò)程。</
38、p><p> 第五章總結(jié)本文的主要工作內(nèi)容,指出本次設(shè)計(jì)的不足之處,提出改進(jìn)意見(jiàn)。</p><p> 第二章 ASN.1 BER的編碼算法</p><p> ASN.1定義了豐富的數(shù)據(jù)值類型,并給出了詳細(xì)的編碼規(guī)則,這些規(guī)則約定了數(shù)據(jù)值應(yīng)該按照何種結(jié)構(gòu)編碼為二進(jìn)制比特流。根據(jù)這些編碼規(guī)則,本章分析數(shù)據(jù)值編碼的各種算法,討論比較其算法的優(yōu)劣,確定本文對(duì)數(shù)據(jù)值編碼時(shí)
39、采用的算法。</p><p> 2.1 ASN.1 BER數(shù)據(jù)值的編碼組成</p><p> 數(shù)據(jù)值的編碼應(yīng)有下列次序的4種成分組成:</p><p> 1) 標(biāo)識(shí)符八位位組</p><p> 2) 長(zhǎng)度八位位組</p><p> 2) 內(nèi)容八位位組</p><p> 3)
40、 內(nèi)容結(jié)束八位位組</p><p> 其中內(nèi)容結(jié)束八位位組,只有長(zhǎng)度八位位組的值需要時(shí)才出現(xiàn),即數(shù)據(jù)值編碼結(jié)</p><p> 構(gòu)有兩種形式,見(jiàn)圖1-1和1-2,此處不再贅述。下面分析數(shù)據(jù)值的4種組成成分。</p><p> 2.1.1 標(biāo)識(shí)符八位位組</p><p> 標(biāo)識(shí)符八位位組是對(duì)數(shù)據(jù)值類型的ASN.1標(biāo)簽(類和編號(hào))進(jìn)行編
41、碼。</p><p> 表2-1 標(biāo)簽類的編碼</p><p> 1) 編號(hào)范圍在0—30為低標(biāo)簽編號(hào),其編碼結(jié)構(gòu)見(jiàn)圖2-1。</p><p> 編碼規(guī)則說(shuō)明:圖示中的標(biāo)簽編號(hào)(即位5至位1),應(yīng)把標(biāo)簽編號(hào)編碼為無(wú)符號(hào)二進(jìn)制整數(shù),位5為最高有效位。</p><p> 圖2-1 標(biāo)識(shí)符八位位組(低標(biāo)簽編號(hào))</p>
42、<p> 2) 編號(hào)大于30為高標(biāo)簽編號(hào),其編碼結(jié)構(gòu)見(jiàn)圖2-2。</p><p><b> 編碼規(guī)則說(shuō)明如下:</b></p><p> 1) 標(biāo)識(shí)符八位位組應(yīng)包含一個(gè)引導(dǎo)八位位組及后隨的一個(gè)或多個(gè)后繼八位位組;</p><p> 2) 位5至位1編碼為:111112;</p><p> 3)
43、 后接后繼八位位組,以第一個(gè)后繼八位位組的位7為最高有效位,其余部分編碼規(guī)則見(jiàn)圖2-2所示;</p><p> 4) 第一個(gè)后繼八位位組的位7至位1不應(yīng)都為0。</p><p> 圖2-2 標(biāo)識(shí)符八位位組(高標(biāo)簽編號(hào))</p><p> 2.1.2 長(zhǎng)度八位位組</p><p> 長(zhǎng)度八位位組的形式有兩種:確定形式跟不定形式。&
44、lt;/p><p><b> 確定形式</b></p><p> 應(yīng)用條件:原始編碼;都是立即可用的結(jié)構(gòu)化編碼。</p><p> 編碼方式:短形式——內(nèi)容八位位組數(shù)小于或等于127時(shí);</p><p> 長(zhǎng)形式——內(nèi)容八位位組數(shù)大于127時(shí)。</p><p> 編碼規(guī)則:短形式——由單個(gè)八
45、位位組組成,把內(nèi)容八位位組組數(shù)編碼為無(wú)符號(hào)的二進(jìn)制整數(shù),位7為最高有效位;</p><p> 長(zhǎng)形式——由一個(gè)初始八位位組和一個(gè)或多個(gè)后繼八位位組組成,初始八位位組應(yīng)不使用值111111112。</p><p> 例如:L=30,使用短形式編碼:00011110;L=201,使用長(zhǎng)形式編碼,可編碼為:</p><p> 100000012
46、 初始八位位組</p><p> 110010012 后繼八位位組</p><p><b> 不定形式</b></p><p> 應(yīng)用條件:不都是立即可用的結(jié)構(gòu)化編碼。</p><p> 編碼方式:同確定形式,參照上文。</p><p> 編碼規(guī)則:短形式——由
47、單個(gè)八位位組組成,由內(nèi)容結(jié)束八位位組來(lái)終止,位8應(yīng)置1,位7至位1置為0;</p><p> 長(zhǎng)形式——在內(nèi)容八位位組之后的編碼中出現(xiàn)內(nèi)容結(jié)束八位位組。</p><p> 2.1.3 內(nèi)容八位位組</p><p> 內(nèi)容八位位組應(yīng)由0個(gè)、1個(gè)或多個(gè)八位位組組成,它依賴于數(shù)據(jù)值的類型。具體編碼規(guī)則見(jiàn)后續(xù)章節(jié),如布爾值,整數(shù)值,實(shí)數(shù)值內(nèi)容編碼等。</p&g
48、t;<p> 2.1.4 內(nèi)容結(jié)束八位位組</p><p> 長(zhǎng)度按不定形式規(guī)定編碼,則應(yīng)出現(xiàn)內(nèi)容結(jié)束八位位組。內(nèi)容結(jié)束八位位組由兩個(gè)值為0的八位位組組成。內(nèi)容八位位組可認(rèn)為是值的編碼,其標(biāo)簽為通用類,形式為原始編碼,標(biāo)簽號(hào)為0,且內(nèi)容不存在。其編碼結(jié)構(gòu)見(jiàn)表2-2。</p><p> 表2-2 內(nèi)容結(jié)束八位位組結(jié)構(gòu)</p><p> 2.1
49、.5 數(shù)據(jù)值編碼結(jié)果的存儲(chǔ)方式</p><p> 對(duì)于一個(gè)給定的數(shù)據(jù),如整數(shù)值100,它的編碼應(yīng)該包含三部分:標(biāo)識(shí)符八位位組,長(zhǎng)度八位位組和內(nèi)容八位位組,每一部分編碼的結(jié)果應(yīng)該先保存,最后再把各部分連接起來(lái),構(gòu)成整數(shù)100的編碼。編碼的最后結(jié)果存儲(chǔ)起來(lái),供解碼函數(shù)讀取解碼。</p><p> 現(xiàn)在討論,數(shù)據(jù)值編碼結(jié)果以何種方式存儲(chǔ)。</p><p><b
50、> 方式一:鏈表</b></p><p> 鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的。鏈表由一系列結(jié)點(diǎn)(鏈表中每一個(gè)元素稱為結(jié)點(diǎn))組成,結(jié)點(diǎn)可以在運(yùn)行時(shí)動(dòng)態(tài)生成。每個(gè)結(jié)點(diǎn)包括兩個(gè)部分:一個(gè)是存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)域,另一個(gè)是存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的指針域。</p><p> 缺點(diǎn):內(nèi)存的申請(qǐng)管理比較麻煩,編碼結(jié)果無(wú)
51、法保存下來(lái),供下次調(diào)用</p><p> 優(yōu)點(diǎn):用鏈表存儲(chǔ)編碼結(jié)果,可以隨編碼結(jié)果占用空間的大小,動(dòng)態(tài)申請(qǐng)非順序的內(nèi)存塊,而不必像數(shù)組那樣定義固定的內(nèi)存空間,對(duì)存儲(chǔ)空間的利用率較高,另外,鏈表申請(qǐng)的空間,只要內(nèi)存有空閑,就不會(huì)產(chǎn)生溢出。</p><p><b> 方式二:數(shù)組</b></p><p> 數(shù)組,在C語(yǔ)言里,是一種物理存儲(chǔ)單元
52、上連續(xù)的、順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素按照出現(xiàn)的順序存儲(chǔ)到數(shù)組里。</p><p> 缺點(diǎn):數(shù)組需要定義固定的長(zhǎng)度,不適應(yīng)動(dòng)態(tài)增減的情況,當(dāng)數(shù)據(jù)過(guò)多,會(huì)造成內(nèi)存溢出,數(shù)據(jù)過(guò)少,又造成內(nèi)存浪費(fèi)。</p><p> 優(yōu)點(diǎn):數(shù)組分配連續(xù)的一塊內(nèi)存區(qū)域,操作方便快捷。</p><p><b> 方式三:文件</b></p><p&
53、gt; 如果編碼的數(shù)據(jù)有多個(gè),為了方便編碼結(jié)果的重復(fù)應(yīng)用,節(jié)省編碼的開(kāi)支,引入文件,對(duì)各個(gè)編碼結(jié)果永久保存起來(lái),解碼的時(shí)候,只需要讀取保存的編碼文件,就可以完成解碼工作。</p><p> 缺點(diǎn):保存速度慢,依賴于外存儲(chǔ)器,如硬盤(pán)。</p><p> 優(yōu)點(diǎn):可以永久保存,可以重復(fù)應(yīng)用編碼結(jié)果,操作方便。</p><p> 結(jié)論分析:通過(guò)上述存儲(chǔ)方式優(yōu)缺點(diǎn)的比
54、較,本文選取數(shù)組跟文件的方式,共同完成對(duì)編碼結(jié)果的處理工作。數(shù)組完成單次編碼中間結(jié)果的保存工作,簡(jiǎn)單快捷,也不會(huì)浪費(fèi)空間;文件完成單次編碼結(jié)果后數(shù)據(jù)的保存工作。</p><p><b> 2.2 布爾值</b></p><p> 布爾值的編碼是原始編碼。內(nèi)容八位位組由單個(gè)八位位組組成。</p><p> 布爾值為:TRUE,八位位組編碼
55、為非0值;布爾值為FALSE,八位位組編碼為0值。具體編碼情況見(jiàn)表2-3。</p><p> 表2-3 布爾值的編碼</p><p> 2.3 整數(shù)值和枚舉值</p><p><b> 1、整數(shù)值</b></p><p> 整數(shù)值的編碼是原始編碼,內(nèi)容八位位組由一個(gè)或多個(gè)八位位組組成,其值可以是正數(shù),負(fù)數(shù)和0
56、,具有任意大小,本文對(duì)整數(shù)值的編碼最大值約定為占用4字節(jié)。其范圍為:-231——231-1。</p><p><b> 整數(shù)值的編碼規(guī)則:</b></p><p> 1) 內(nèi)容八位位組應(yīng)是整數(shù)值的對(duì)2的補(bǔ)碼的二進(jìn)制數(shù);</p><p> 2) 第一個(gè)八位位組與第二個(gè)八位位組的位8,應(yīng)不全為1且不全為0。</p><
57、p> 整數(shù)值的標(biāo)識(shí)符編碼:標(biāo)識(shí)符固定為0216。</p><p> 整數(shù)值的長(zhǎng)度編碼:根據(jù)整數(shù)值的內(nèi)容占用字節(jié)數(shù),由2.1.2所述規(guī)則編碼。</p><p> 整數(shù)值的內(nèi)容編碼算法:整數(shù)值的編碼,可以采用字符串法和除數(shù)法,現(xiàn)在分析比較兩種算法的特點(diǎn):</p><p><b> 方式一:字符串法</b></p><
58、;p> 若整數(shù)為正數(shù),則直接把該整數(shù)轉(zhuǎn)換為對(duì)應(yīng)的二進(jìn)制形式的字符串,然后計(jì)數(shù)字符串的位數(shù),按照八位為一字節(jié)的原則,對(duì)該字符串處理分割,不足八位的,前面補(bǔ)0湊足八位,超過(guò)八位的,分割出八位,余下的再補(bǔ)0湊足八位;若整數(shù)為負(fù)數(shù),則先對(duì)該整數(shù)求取絕對(duì)值,按照正數(shù)的方式求其二進(jìn)制形式的字符串,對(duì)二進(jìn)制字符串取反(1換成0,0換為1)加1求得該數(shù)的二進(jìn)制補(bǔ)碼,按照八位一字節(jié)的原則,對(duì)字符串分割處理(同正數(shù))。</p><
59、;p><b> 方式二:除數(shù)法</b></p><p> 由于編碼是以字節(jié)為單位的,一個(gè)字節(jié)有八比特位,八位都為1時(shí),對(duì)應(yīng)的整數(shù)為255。所以對(duì)該整數(shù)編碼,可以先用該整數(shù)除以256,直到商為0,每除一次,計(jì)數(shù)器加1,該計(jì)數(shù)器即為內(nèi)容八位位組的八位位組個(gè)數(shù),其內(nèi)容為111111112。對(duì)商為0前的余數(shù)編碼(整數(shù)對(duì)應(yīng)的二進(jìn)制數(shù)),加上前面的編碼內(nèi)容,即為該整數(shù)的內(nèi)容編碼結(jié)果。</
60、p><p> 結(jié)論分析:采用字符串法對(duì)整數(shù)值編碼,顯得稍微復(fù)雜,但是其結(jié)構(gòu)明了,有利于長(zhǎng)度八位位組的編碼計(jì)算,同時(shí)與其他類型的數(shù)據(jù)編碼具有共性,故可以重復(fù)利用其編碼函數(shù),所以這里采用字符串法對(duì)整數(shù)內(nèi)容進(jìn)行編碼。</p><p> 下面,列出一些典型的整數(shù)值編碼實(shí)例,見(jiàn)表2-4。</p><p> 表2-4 整數(shù)值的編碼</p><p>&l
61、t;b> 2、枚舉值</b></p><p> 枚舉值的編碼,實(shí)際上是與之對(duì)應(yīng)的整數(shù)值的編碼,其規(guī)則同整數(shù)值的規(guī)則一樣,這里不再贅述。</p><p><b> 2.4 實(shí)數(shù)值</b></p><p> 2.4.1 實(shí)數(shù)值的編碼規(guī)則</p><p> 實(shí)數(shù)值編碼是原始編碼,八位位組標(biāo)識(shí)符為
62、0916,長(zhǎng)度編碼根據(jù)內(nèi)容編碼占用的字節(jié)及2.1.2的規(guī)則確定,內(nèi)容編碼部分,根據(jù)值的大小,其編碼分三種情況討論:</p><p> 情形一:實(shí)數(shù)值為0,編碼中沒(méi)有內(nèi)容八位位組。內(nèi)容編碼如下所示:</p><p> 00001001 000000002</p><p> 情形二:實(shí)數(shù)值為無(wú)窮,則應(yīng)只有一個(gè)內(nèi)容八位位組,內(nèi)容編碼如下:</p>&l
63、t;p> 010000002 值為PLUS-INFINITY(無(wú)窮大)</p><p> 010000012 值為MINUS-INFINITY(無(wú)窮?。?lt;/p><p> 情形三:實(shí)數(shù)值為其他值,下面討論這種情況。</p><p> 1) 若抽象值的基數(shù)為10,則第一個(gè)內(nèi)容八位位組的位8=0,位7=0,位6至位1規(guī)定如表2-5
64、所示。</p><p> 表2-5 十進(jìn)制編碼位6至位1編碼說(shuō)明</p><p> 位6至位1中剩余的值為保留部分,跟在第一個(gè)內(nèi)容八位位組之后的內(nèi)容八位位組部分則按照SJ/Z 9047-1987的規(guī)定進(jìn)行編碼。</p><p> 2) 若抽象值的基數(shù)為2,8或16,則按二進(jìn)制的方式對(duì)內(nèi)容編碼。第一個(gè)內(nèi)容八位位組的位8至位1各部分說(shuō)明如圖2-3所示。<
65、/p><p> 圖2-3 實(shí)數(shù)值第一個(gè)內(nèi)容八位位組說(shuō)明</p><p> 剩余的內(nèi)容八位位組將整數(shù)N的值編碼為無(wú)符號(hào)二進(jìn)制數(shù)。</p><p> 2.4.2 實(shí)數(shù)值的精度</p><p> 根據(jù)IEEE-754國(guó)際標(biāo)準(zhǔn),常用的浮點(diǎn)數(shù)有兩種格式,即單精度浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)。IEEE754規(guī)定,單精度浮點(diǎn)數(shù)用4字節(jié)存儲(chǔ),雙精度浮點(diǎn)數(shù)用8
66、字節(jié)存儲(chǔ),分為三個(gè)部分:符號(hào)位、階和尾數(shù)。階即指數(shù),尾數(shù)即有效小數(shù)位數(shù)。單精度格式階占8位,尾數(shù)占24位,符號(hào)位1位,雙精度則有11位階碼,53位尾數(shù)和1位符號(hào)位。下表2-6列出單精度跟雙精度的存儲(chǔ)結(jié)構(gòu)。</p><p> 表2-6 單精度/雙精度存儲(chǔ)結(jié)構(gòu)</p><p> 在C/C++編譯器中,單精度浮點(diǎn)數(shù)對(duì)應(yīng)float型實(shí)數(shù),雙精度浮點(diǎn)數(shù)對(duì)應(yīng)double型實(shí)數(shù)。所以對(duì)于實(shí)數(shù)值的編
67、碼,本文采用兩種不同寬度的編碼方式,即單精度編碼和雙精度編碼。下面舉例討論C語(yǔ)言中,float型和double型是如何在計(jì)算機(jī)中存儲(chǔ)表示的。</p><p> 單精度浮點(diǎn)數(shù),舉例說(shuō)明其存儲(chǔ)結(jié)構(gòu),有一單精度浮點(diǎn)數(shù)4.25,則它在計(jì)算機(jī)中的存儲(chǔ)方式如圖2-4所示。</p><p> 4.25轉(zhuǎn)換為二進(jìn)制數(shù)為100.01,寫(xiě)成科學(xué)計(jì)數(shù)法為1.0001*22。分解如下:為正數(shù),故符號(hào)位為0;指
68、數(shù)部分為2;尾數(shù)為0001。最終單精度浮點(diǎn)數(shù)4.25在計(jì)算機(jī)中存儲(chǔ)的二進(jìn)制結(jié)果為:0 1000 0001 000 1000 0000 0000 0000 0000。</p><p> 圖2-4 Float型數(shù)據(jù)在計(jì)算機(jī)中的存儲(chǔ)方式</p><p> 雙精度浮點(diǎn)數(shù),跟單精度浮點(diǎn)數(shù)具有類似的存儲(chǔ)結(jié)構(gòu),它所表示的范圍更廣,占用的字節(jié)數(shù)為8個(gè),計(jì)算精度更高,這里不作討論。</p>
69、<p> 2.4.3 實(shí)數(shù)值的編碼算法</p><p> 實(shí)數(shù)值的標(biāo)識(shí)符編碼:實(shí)數(shù)值是原始編碼,標(biāo)識(shí)符編碼為:0916。</p><p> 實(shí)數(shù)值的長(zhǎng)度編碼:它取決于實(shí)數(shù)值內(nèi)容編碼占用的字節(jié)數(shù),參照2.1.2長(zhǎng)度編碼的規(guī)則,對(duì)實(shí)數(shù)值長(zhǎng)度進(jìn)行編碼。</p><p> 實(shí)數(shù)值的內(nèi)容編碼:實(shí)際上是對(duì)實(shí)數(shù)值尾數(shù)M,符號(hào)S及指數(shù)的計(jì)算。下面分析討論兩種
70、對(duì)實(shí)數(shù)值編碼的方法。</p><p> 方法一:由ASN.1 BER實(shí)數(shù)值編碼規(guī)則可知,其內(nèi)容編碼與實(shí)數(shù)值在計(jì)算機(jī)中的存儲(chǔ)結(jié)構(gòu)相似(參見(jiàn)2.4.2節(jié)圖2-4),所以我們只要找出計(jì)算機(jī)中存儲(chǔ)的該實(shí)數(shù)的符號(hào)S,尾數(shù)M及其指數(shù)P,然后把它們轉(zhuǎn)換為符合ASN.1 BER實(shí)數(shù)值編碼規(guī)則的結(jié)構(gòu),就完成了對(duì)實(shí)數(shù)值的編碼。</p><p> 方法二:對(duì)一個(gè)二進(jìn)制表示的實(shí)數(shù),先對(duì)該數(shù)進(jìn)行移位,向左或向右
71、移P位,直到該數(shù)符合科學(xué)計(jì)數(shù)法的表示方法,即整數(shù)部分為1,后接小數(shù)點(diǎn)跟小數(shù)位。這時(shí)編碼的指數(shù)就是P或-P,小數(shù)點(diǎn)后面的就是該實(shí)數(shù)的尾數(shù)M,如果該數(shù)是正數(shù),則S為-1,否則為+1。求得了尾數(shù)M,指數(shù)P,符號(hào)位S,按照實(shí)數(shù)值編碼規(guī)則,對(duì)實(shí)數(shù)進(jìn)行編碼。</p><p> 結(jié)論分析:方法一的編碼方式,依賴于計(jì)算機(jī)跟操作系統(tǒng)的支持,當(dāng)代碼移植到其他平臺(tái)或缺少操作系統(tǒng)的平臺(tái),或者不是IEEE754規(guī)范的硬件平臺(tái)就無(wú)法正確編
72、碼解碼了,局限性比較大。方法二的編碼方式,采用移位方式完成指數(shù),尾數(shù)的計(jì)算,代碼容易移植,編碼具有一般性,但是具體操作沒(méi)方法一的結(jié)構(gòu)清晰,可理解性稍差。綜合比較分析上述兩種方法,本文嘗試采用上述兩種方式對(duì)實(shí)數(shù)值編碼。單精度編碼采用方法二,雙精度編碼采用方法一。</p><p> 單精度編碼,指數(shù)位(8位)占用一個(gè)字節(jié)編碼;雙精度編碼,指數(shù)位(11位)占用兩個(gè)字節(jié)編碼。下表2-7,列舉幾個(gè)單精度編碼示例。<
73、/p><p> 表2-7 單精度編碼示例</p><p><b> 2.5 位串值</b></p><p> 位串值的編碼是原始編碼,或是結(jié)構(gòu)化編碼。當(dāng)整個(gè)位串可用之前有必要傳送部分位串時(shí),使用結(jié)構(gòu)化編碼。</p><p> 位串值標(biāo)識(shí)符編碼:原始編碼——0316;結(jié)構(gòu)化編碼——2316。</p>
74、<p> 位串值長(zhǎng)度編碼:原始編碼——根據(jù)內(nèi)容編碼占用字節(jié)數(shù)計(jì)算;結(jié)構(gòu)化編碼——整個(gè)長(zhǎng)度編碼是所有單獨(dú)部分占用字節(jié)數(shù)的總和,另外加內(nèi)容結(jié)束八位位組標(biāo)志0016。</p><p><b> 位串值編碼規(guī)則:</b></p><p> 1) 原始編碼,包含一個(gè)初始八位位組,后隨0,1或多個(gè)后繼八位位組。初始八位位組應(yīng)編碼最后一個(gè)后繼八位位組未使用的數(shù),范
75、圍:0至7。</p><p> 2) 結(jié)構(gòu)化編碼,將編碼分段,除最后一個(gè)段,每個(gè)段應(yīng)包含8的整數(shù)倍的位數(shù),每個(gè)段都有完整的編碼,包括標(biāo)識(shí)符、長(zhǎng)度和內(nèi)容編碼。</p><p> 位串值內(nèi)容編碼算法:</p><p> 原始編碼算法:對(duì)于輸入的位串值(若輸入十六進(jìn)制,則先把十六進(jìn)制轉(zhuǎn)換為二進(jìn)制),計(jì)算位串的長(zhǎng)度,對(duì)8取余,余數(shù)即為初始八位位組需要編碼的位數(shù),把余
76、數(shù)編碼為無(wú)符號(hào)二進(jìn)制數(shù),然后連接輸入的位串值,構(gòu)成位串值內(nèi)容八位位組。</p><p> 結(jié)構(gòu)化編碼算法:對(duì)輸入的位串值分段,每段都按照原始編碼的處理方法處理,最后把每段內(nèi)容編碼連接起來(lái)構(gòu)成最后的內(nèi)容編碼結(jié)果。</p><p> 下面舉例說(shuō)明,采用原始編碼對(duì)位串值編碼的結(jié)構(gòu)形式(見(jiàn)表2-8)和采用結(jié)構(gòu)化編碼方式位串值的編碼結(jié)構(gòu)形式(見(jiàn)表2-9)。</p><p>
77、; 表2-8 采用原始編碼的位串值編碼示例</p><p> 表2-9 采用結(jié)構(gòu)化編碼的位串值編碼示例</p><p> 2.6 八位位組串值</p><p> 八位位組串值的編碼是位串值編碼的特例,與位串值編碼相比,具有如下特點(diǎn):</p><p> 1) 八位位組串值,編碼的數(shù)據(jù)值包含8的整數(shù)倍的位數(shù),所以八位位組串值的編
78、碼不包含初始八位位組;</p><p> 2) 八位位組串值的標(biāo)識(shí)符為:0416,也可以采用原始編碼和結(jié)構(gòu)化編碼兩種方式進(jìn)行編碼。</p><p> 八位位組串值的編碼,與位串值編碼類似,這里就不再單獨(dú)討論八位位組串值的編碼算法了,具體編碼可以參照2.5位串值的編碼。下面給出采用原始編碼方式的位串值/八位位組串編碼比較,見(jiàn)表2-10。</p><p> 表2
79、-10 采用原始編碼方式的位串值/八位位組串編碼比較</p><p><b> 2.7 空值</b></p><p> 空值標(biāo)識(shí)符編碼:空值的編碼是原始編碼,標(biāo)識(shí)符為:0516。</p><p> 空值長(zhǎng)度編碼:0016。</p><p> 空值內(nèi)容編碼:不包含任何八位位組。</p><p
80、> 所以對(duì)空值的編碼,其完整編碼如下表2-11所示:</p><p> 表2-11 空值的編碼</p><p><b> 2.8 結(jié)構(gòu)化值</b></p><p> 2.8.1 序列值</p><p> 序列值編碼是結(jié)構(gòu)化編碼,標(biāo)識(shí)符編碼為:3016。</p><p> 序
81、列值長(zhǎng)度編碼:序列值的長(zhǎng)度由編碼內(nèi)容的占用的字節(jié)數(shù)決定,它應(yīng)該包含序列值內(nèi)容編碼所有內(nèi)容的長(zhǎng)度(包括其他數(shù)據(jù)類型的完整編碼,標(biāo)識(shí)符,長(zhǎng)度,內(nèi)容)。</p><p><b> 序列值編碼規(guī)則:</b></p><p> 1) 內(nèi)容八位位組,由前面所描述的各種原始編碼或結(jié)構(gòu)化編碼組成,每個(gè)數(shù)據(jù)類型的編碼都是一個(gè)完整編碼(包含標(biāo)識(shí)符,長(zhǎng)度和內(nèi)容)。</p>
82、<p> 2) 每種數(shù)據(jù)類型的編碼,應(yīng)該按照出現(xiàn)定義的次序編碼,除非帶有關(guān)鍵字:OPTIONAL或者DEFAULT,帶上關(guān)鍵字的數(shù)據(jù)值可以出現(xiàn),也可以不出現(xiàn)。</p><p><b> 序列值的編碼算法:</b></p><p> 序列值的編碼,實(shí)際上是對(duì)布爾值、整數(shù)值、實(shí)數(shù)值、位串值、八位位串值、空值等原始編碼或結(jié)構(gòu)化編碼的調(diào)用,所以在處理序列
83、值編碼時(shí),本文定義一些關(guān)鍵字,用以識(shí)別前幾節(jié)論述的數(shù)據(jù)類型,根據(jù)關(guān)鍵字,調(diào)用相應(yīng)的編碼處理函數(shù),就可以完成序列值的編碼。下面舉例說(shuō)明,見(jiàn)表2-12。</p><p> 表2-12 序列值編碼示例</p><p> 所以,該序列值的完整編碼為:30 0C 01 01 FF 02 01 64 09 04 81 00 04 4416。</p><p> 2.8.2
84、 單一序列值</p><p> 單一序列值,是序列值的特殊情況,單一序列值的編碼也是結(jié)構(gòu)化編碼,它跟序列值編碼具有類似的規(guī)則,具有次序?,F(xiàn)在說(shuō)明他們的區(qū)別:</p><p> 1) 序列值,一次編碼可以有多種數(shù)據(jù)值類型,可以使用結(jié)構(gòu)化嵌套。如表2-12所列,一次可以編碼布爾值,整數(shù)值和實(shí)數(shù)值;</p><p> 2) 單一序列值,一次編碼只能編碼若干個(gè)相
85、同類型的數(shù)據(jù)值,它不可以同時(shí)編碼不同的數(shù)據(jù)類型,它的編碼模式是:實(shí)數(shù)值1,實(shí)數(shù)值2…實(shí)數(shù)值n。</p><p> 單一序列值的編碼實(shí)現(xiàn)同序列值一樣,這里不再闡述。</p><p> 2.8.3 集合值</p><p> 集合值的編碼是結(jié)構(gòu)化編碼,標(biāo)識(shí)符編碼為:3116。</p><p> 集合值的編碼與序列值編碼類似,這里闡述其區(qū)別
86、:</p><p> 1) 序列值編碼是按照各種數(shù)據(jù)類型出現(xiàn)的順序編碼的,而集合值的編碼,不必按照數(shù)據(jù)值出現(xiàn)的順序進(jìn)行編碼,對(duì)傳送期間的次序也沒(méi)有限制;</p><p> 2) 對(duì)帶有關(guān)鍵字OPTIONAL或DEFAULT的數(shù)據(jù)值,它的編碼可以出現(xiàn),也可以不出現(xiàn),對(duì)沒(méi)有關(guān)鍵字的數(shù)據(jù),按照發(fā)送器選定的次序出現(xiàn)。</p><p> 如表2-12所示,如果集合值
87、編碼這三個(gè)數(shù)據(jù)值,則它可以編碼為下面情況:</p><p> 31 0C 01 01 FF 02 01 64 09 04 81 00 04 4416</p><p> 31 0C 09 04 81 00 04 44 01 01 FF 02 01 6416</p><p> 上面兩種方式都正確,數(shù)據(jù)值編碼的出現(xiàn)不必遵從數(shù)據(jù)值的出現(xiàn)次序。</p>&
88、lt;p> 2.8.4 單一集合值</p><p> 單一集合值是集合值的特殊情況,跟序列值/單一序列值的關(guān)系是一樣的,它也是結(jié)構(gòu)化編碼,單一集合值的的標(biāo)識(shí)符跟集合值相同:3116。單一集合值的編碼及后續(xù)解碼,都不必保持?jǐn)?shù)據(jù)值的次序,它編碼的模式是:實(shí)數(shù)值1,實(shí)數(shù)值2…實(shí)數(shù)值n。其他具體編碼算法跟集合值一致,這里不再闡述。</p><p> 2.8.5 選擇值</p&
89、gt;<p> 選擇值的編碼應(yīng)與被選擇的類型值編碼相同,用于標(biāo)識(shí)八位位組的標(biāo)簽是被選擇的類型的標(biāo)簽。選擇值編碼可以是原始編碼,也可是是結(jié)構(gòu)化編碼,具體編碼取決于選擇的數(shù)據(jù)值編碼算法。</p><p><b> 2.9 本章小結(jié)</b></p><p> ASN.1 BER的數(shù)據(jù)值的編碼,一般有三部分組成:標(biāo)識(shí)符八位位組,長(zhǎng)度八位位組和內(nèi)容八位位組
90、。本章從這三部分出發(fā),先后簡(jiǎn)單介紹了幾種原始數(shù)據(jù)值類型和結(jié)構(gòu)化數(shù)據(jù)值的編碼規(guī)則。本章介紹的原始類型有:布爾值,整數(shù)值,實(shí)數(shù)值,位串值,八位位串值和空值;結(jié)構(gòu)類型有:序列值,單一序列值,集合值,單一集合之和選擇值。</p><p> 本章還著重介紹了各種數(shù)據(jù)值的編碼算法,分析比較了幾種算法的特點(diǎn),及確定了在具體編碼環(huán)節(jié)中,選取何種方法,按照ASN.1 BER的規(guī)則,對(duì)數(shù)據(jù)值進(jìn)行編碼,為后續(xù)章節(jié)的實(shí)現(xiàn)過(guò)程,奠定了理
91、論基礎(chǔ)。</p><p> 第三章 基于ASN.1 BER規(guī)約的編碼實(shí)現(xiàn)</p><p> 前面的章節(jié),已經(jīng)對(duì)ASN.1 BER規(guī)約做了詳細(xì)的介紹,并分析討論了各數(shù)據(jù)值類型的編碼算法比較,本章將按照選定的算法開(kāi)始對(duì)數(shù)據(jù)值進(jìn)行編碼,包括數(shù)據(jù)值編碼流程圖,數(shù)據(jù)值的編碼結(jié)果等。</p><p> 3.1 布爾值的編碼</p><p>
92、布爾值的編碼由三部分構(gòu)成,標(biāo)識(shí)符,長(zhǎng)度和內(nèi)容。其中標(biāo)識(shí)符和長(zhǎng)度都是固定的值,內(nèi)容編碼時(shí),判斷輸入的布爾值是TRUE還是FALSE,是TRUE則編碼為FF16,是FALSE則編碼為0016。</p><p> 布爾值的編碼流程圖見(jiàn)圖3-1。</p><p> 圖3-1 布爾值編碼流程圖</p><p> 按照?qǐng)D3-1所示流程圖,編寫(xiě)出完整的布爾值編碼程序。下圖
93、3-2是布爾值編碼程序運(yùn)行的截圖。程序編碼結(jié)果顯示的方式,有十六進(jìn)制和二進(jìn)制,其與具體的編碼規(guī)則無(wú)關(guān),它的轉(zhuǎn)換程序這里就不討論了。</p><p> 圖3-2 布爾值的編碼結(jié)果</p><p> 3.2 整數(shù)值和枚舉值的編碼</p><p> 整數(shù)值的編碼有三部分組成:標(biāo)識(shí)符,長(zhǎng)度和內(nèi)容。ASN.1 BER編碼規(guī)則中,標(biāo)識(shí)符都是固定的值,編碼的最后直接加上
94、標(biāo)識(shí)符,就是最后的編碼結(jié)果,這里包括后續(xù)章節(jié),對(duì)標(biāo)識(shí)符均不再闡述。下面討論長(zhǎng)度編碼和整數(shù)值內(nèi)容編碼。</p><p><b> 長(zhǎng)度編碼</b></p><p> ASN.1 BER中所討論的數(shù)據(jù)值,都涉及到長(zhǎng)度的編碼,長(zhǎng)度八位位組的編碼規(guī)則,在第二章已經(jīng)詳細(xì)闡述過(guò),這里討論長(zhǎng)度八位位組的編碼函數(shù)具體實(shí)現(xiàn)。</p><p> 圖3-3 長(zhǎng)
95、度編碼處理函數(shù)流程圖</p><p> 思路:在內(nèi)容八位位組編碼完畢后,讀取內(nèi)容八位位組編碼的長(zhǎng)度N,把N編碼為無(wú)符號(hào)的二進(jìn)制數(shù)。圖3-3給出長(zhǎng)度編碼處理函數(shù)的流程圖。</p><p> 在以后的各種數(shù)據(jù)值中,有長(zhǎng)度編碼時(shí),只需要調(diào)用此處的長(zhǎng)度編碼處理函數(shù),就可以完成長(zhǎng)度的編碼計(jì)算。從而節(jié)省代碼編寫(xiě)的工作量,提高代碼的利用率。</p><p><b>
96、 整數(shù)值內(nèi)容編碼</b></p><p> 整數(shù)值內(nèi)容八位位組的編碼,采用字符串法。具體實(shí)現(xiàn)過(guò)程如下:輸入一個(gè)整數(shù),判斷該數(shù)是正數(shù)還是負(fù)數(shù),若為正數(shù),則直接把該數(shù)轉(zhuǎn)換為二進(jìn)制字符串,然后計(jì)算該字符串長(zhǎng)度,在字符串前補(bǔ)0使得字符串位數(shù)是8的整數(shù)倍。若為負(fù)數(shù),則先求得其絕對(duì)值,按照正數(shù)方法進(jìn)行字符串編碼,取反+1,求得其二進(jìn)制補(bǔ)碼形式的字符串,最后對(duì)字符串補(bǔ)0,使得其位數(shù)是8的整數(shù)倍。下圖3-4是整數(shù)
97、值內(nèi)容編碼的流程圖。</p><p> 圖3-4 整數(shù)值內(nèi)容編碼流程圖</p><p> 按照整數(shù)值內(nèi)容編碼流程圖3-4,和長(zhǎng)度編碼處理函數(shù)流程圖3-3,編寫(xiě)出完整的整數(shù)值編碼程序。圖3-5是整數(shù)值編碼程序的運(yùn)行結(jié)果截圖。</p><p> 圖3-5 整數(shù)值編碼結(jié)果</p><p><b> 枚舉值編碼</b>
98、;</p><p> 枚舉值的編碼是與之相關(guān)的整數(shù)值的編碼,其具體編碼程序跟整數(shù)值編碼函數(shù)可以一樣,這里不再另外編碼。</p><p> 3.3 實(shí)數(shù)值的編碼</p><p> 實(shí)數(shù)值的編碼規(guī)則比較復(fù)雜,需要編碼的情形比較多。無(wú)窮大,無(wú)窮小,0值,這三個(gè)數(shù)值的內(nèi)容編碼固定,這里不作分析討論,具體的編碼時(shí),超出實(shí)數(shù)值精度最大數(shù)的數(shù)值編碼為無(wú)窮大,小于實(shí)數(shù)值精度
99、最小值的數(shù)值編碼為無(wú)窮小,下面討論分析實(shí)數(shù)值為可編碼的一般情況。</p><p> 3.3.1 實(shí)數(shù)值編碼分析</p><p> 實(shí)數(shù)值的標(biāo)識(shí)符編碼為:0916。長(zhǎng)度編碼見(jiàn)圖3-3,調(diào)用長(zhǎng)度編碼處理函數(shù),這里不再作詳細(xì)介紹。對(duì)實(shí)數(shù)值的內(nèi)容編碼,本文采用二進(jìn)制的方法統(tǒng)一編碼。圖3-6是實(shí)數(shù)值編碼函數(shù)的流程圖。</p><p> 圖3-6 實(shí)數(shù)值編碼流程圖&l
100、t;/p><p> 實(shí)數(shù)值的編碼有十進(jìn)制編碼和二進(jìn)制編碼,本文只討論二進(jìn)制編碼方式,對(duì)輸入的十進(jìn)制實(shí)數(shù),先把十進(jìn)制轉(zhuǎn)換為二進(jìn)制,然后用二進(jìn)制編碼方式對(duì)實(shí)數(shù)值編碼。實(shí)數(shù)值內(nèi)容編碼有單精度編碼和雙精度編碼,本文分別用不同的方法對(duì)單精度浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)進(jìn)行編碼。</p><p> 使用二進(jìn)制編碼時(shí),該實(shí)數(shù)的組成如下:</p><p> M = S * N * 2F
101、 M為尾數(shù)N為一個(gè)非負(fù)整數(shù)</p><p> 0 <= F < 4 F為二進(jìn)制比例因子</p><p> S= +1 或 -1 S為符號(hào)位,S = -1,則位7為1,否則為0</p><p> 3.3.2 單精度浮點(diǎn)數(shù)編碼</p&g
102、t;<p> 單精度編碼,符號(hào)位為S,占一位,在第一個(gè)字節(jié)第二位體現(xiàn);指數(shù)位P為8位,占一個(gè)字節(jié);尾數(shù)位M最多保留23位。對(duì)實(shí)數(shù)值的編碼,實(shí)際上是對(duì)S,P和M的求解。圖3-7是單精度浮點(diǎn)數(shù)編碼函數(shù)流程圖。</p><p> 圖3-7 單精度編碼函數(shù)處理流程圖</p><p> 根據(jù)單精度編碼函數(shù)處理流程圖(圖3-7),編寫(xiě)出單精度編碼函數(shù),結(jié)合實(shí)數(shù)值編碼流程圖(圖3-
103、6),編寫(xiě)出完整的實(shí)數(shù)值編碼程序,程序運(yùn)行結(jié)果截圖見(jiàn)圖3-8。</p><p> 圖3-8 單精度浮點(diǎn)數(shù)編碼結(jié)果</p><p> 3.3.3 雙精度浮點(diǎn)數(shù)編碼</p><p> 雙精度編碼,符號(hào)位S,占一位,在第一個(gè)字節(jié)第二位體現(xiàn);指數(shù)位P有11位,占用兩個(gè)字節(jié)編碼;尾數(shù)M最多保留52位。下面采用第二章討論的方式,對(duì)雙精度浮點(diǎn)數(shù)進(jìn)行編碼,圖3-9是雙精度
104、浮點(diǎn)數(shù)編碼流程圖。</p><p> 圖3-9 雙精度編碼函數(shù)處理流程圖</p><p> 雙精度編碼可以采用單精度編碼的方式進(jìn)行編碼,只是保留的尾數(shù)位更多,精度更高,范圍更大。根據(jù)雙精度編碼函數(shù)處理流程圖,編寫(xiě)出完整的雙精度浮點(diǎn)數(shù)編碼程序,圖3-10是雙精度浮點(diǎn)數(shù)編碼的結(jié)果截圖。</p><p> 圖3-10 雙精度浮點(diǎn)數(shù)編碼結(jié)果</p>
105、<p> 3.4 位串值的編碼</p><p> 位串值的編碼有原始編碼和結(jié)構(gòu)化編碼,本文選取原始編碼類型對(duì)位串值編碼。位串值的標(biāo)識(shí)符為0316。位串值的長(zhǎng)度編碼調(diào)用長(zhǎng)度編碼處理函數(shù)(見(jiàn)3.2節(jié))。位串值的內(nèi)容編碼編碼算法跟規(guī)則,前面已經(jīng)討論,圖3-12給出位串值編碼流程圖。圖3-11給出位串值編碼結(jié)果截圖。</p><p> 圖3-11 位串值編碼結(jié)果</p&g
106、t;<p> 根據(jù)圖3-12位串值內(nèi)容編碼流程圖,編寫(xiě)出完整的位串值編碼程序。輸入的方式有十六進(jìn)制跟二進(jìn)制兩種方式,圖3-11給出的是以二進(jìn)制方式輸入的位串值編碼結(jié)果,十六進(jìn)制輸入方式的編碼結(jié)果,跟二進(jìn)制一樣,具體運(yùn)行參見(jiàn)程序。</p><p> 圖3-12 位串值內(nèi)容編碼流程圖</p><p> 3.5 八位位組串值的編碼</p><p>
107、 八位位組串值的編碼也有原始編碼和結(jié)構(gòu)化編碼,本文只討論原始編碼類型。八位位組串值的標(biāo)識(shí)符為:0416。其長(zhǎng)度編碼調(diào)用長(zhǎng)度編碼函數(shù),見(jiàn)(3.2節(jié))。內(nèi)容編碼算法類似于位串值編碼,圖3-13給出八位位組串值內(nèi)容編碼的流程圖3-13。</p><p> 圖3-13 八位位組串值內(nèi)容編碼流程圖</p><p> 根據(jù)流程圖,可以編寫(xiě)出完整的八位位組串值的編碼程序,圖3-14是其完整程序的
108、運(yùn)行截圖。八位位組串值的輸入定義了兩種方式,十六進(jìn)制跟二進(jìn)制,下圖給出的是十六進(jìn)制輸入方式下的編碼,二進(jìn)制方式下的編碼,見(jiàn)完整的編碼程序。</p><p> 圖3-14 八位位組串值編碼結(jié)果</p><p> 3.6 空值的編碼</p><p> 空值的編碼是原始編碼,標(biāo)識(shí)符編碼為:0516。長(zhǎng)度編碼為固定值:0016??罩档木幋a不含有內(nèi)容編碼。圖3-15
109、是空值編碼程序的流程圖。</p><p> 圖3-15 空值編碼程序流程圖</p><p> 程序運(yùn)行時(shí),若輸入的值為:Null,不管大小寫(xiě),則把該值編碼為空值;否則,中斷程序,輸出出錯(cuò)信息。編寫(xiě)出空值編碼的完整程序,程序運(yùn)行時(shí)的結(jié)果截圖如圖3-16所示。</p><p> 圖3-16 空值編碼結(jié)果</p><p> 3.7 結(jié)
110、構(gòu)化編碼</p><p> 結(jié)構(gòu)化類型的數(shù)據(jù)值包括:序列值、單一序列值、集合值、單一集合值等。本文只討論上述幾種數(shù)據(jù)值類型的編碼。結(jié)構(gòu)化數(shù)據(jù)值的編碼,實(shí)際上是對(duì)原始數(shù)據(jù)值編碼函數(shù)的調(diào)用,等完成指定的原始數(shù)據(jù)值編碼后,計(jì)算它們的長(zhǎng)度(內(nèi)容所占的位數(shù)),調(diào)用長(zhǎng)度編碼函數(shù)編碼其長(zhǎng)度八位位組。下面具體分析上述類型值。</p><p> 3.7.1 序列值的編碼</p><
111、p> 序列值的編碼是結(jié)構(gòu)化編碼,其標(biāo)識(shí)符編碼為:3016。序列值的長(zhǎng)度編碼跟原始編碼類似,調(diào)用長(zhǎng)度編碼處理函數(shù)(見(jiàn)3.2節(jié))完成序列值長(zhǎng)度的編碼工作。序列值的內(nèi)容包含其他各種數(shù)據(jù)類型,它的編碼實(shí)際上是對(duì)各種數(shù)據(jù)值類型編碼的完整調(diào)用。在編寫(xiě)序列值編碼程序之前,先完成對(duì)布爾值,整數(shù)值,實(shí)數(shù)值等數(shù)據(jù)值編碼函數(shù)的封裝,序列值編碼程序只需要識(shí)別出要編碼數(shù)據(jù)值的類型,調(diào)用相應(yīng)的數(shù)據(jù)值處理函數(shù),即可完成序列值的編碼。</p>&
112、lt;p><b> 數(shù)據(jù)值類型約定</b></p><p> 序列值的內(nèi)容編碼是對(duì)原始數(shù)據(jù)值的編碼函數(shù)的調(diào)用,這就需要判別輸入的數(shù)據(jù)是何種數(shù)據(jù)值類型,為了判別輸入的數(shù)據(jù)值類型,定義如下關(guān)鍵字:</p><p> CBOOL:表明后面的數(shù)據(jù)值類型是布爾值;</p><p> CINT:表明后面的數(shù)據(jù)值類型是整數(shù)值;</p>
113、;<p> CFLOAT:表明后面的數(shù)據(jù)值類型是實(shí)數(shù)值;</p><p> CWEICHUAN:表明后面的數(shù)據(jù)值類型是位串值;</p><p> CBWEICHUAN:表明后面的數(shù)據(jù)值類型是八位位組串值;</p><p> CNULL:表明后面的數(shù)據(jù)值類型是空值;</p><p> }:表明數(shù)據(jù)值讀取結(jié)束,序列值編碼退
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- asn.1語(yǔ)法分析及ber自動(dòng)編解碼軟件的設(shè)計(jì)與實(shí)現(xiàn)
- lte系統(tǒng)中asn.1編解碼的設(shè)計(jì)與實(shí)現(xiàn)
- 基于asn.1的通用編解碼方案的設(shè)計(jì)與實(shí)現(xiàn)
- lte系統(tǒng)中asn.1編解碼的研究與實(shí)現(xiàn)
- 基于asn.1的智能網(wǎng)編解碼技術(shù)研究
- tdscdma系統(tǒng)中asn.1編解碼的研究與應(yīng)用
- 畢業(yè)論文——基于fpga的crc編解碼器的設(shè)計(jì)
- jpeg圖像的編解碼實(shí)現(xiàn)-畢業(yè)論文
- 畢業(yè)論文----基于fpga的音頻編解碼芯片控制器設(shè)計(jì)
- 現(xiàn)代電信協(xié)議asn.1編解碼實(shí)現(xiàn)機(jī)制的研究
- ltea系統(tǒng)中rrc子層asn.1編解碼的研究與實(shí)現(xiàn)
- 畢業(yè)論文——基于fpga的hdb3編解碼器設(shè)計(jì)
- 畢業(yè)論文——基于fpga的hdb3編解碼器的設(shè)計(jì)
- asn.1通用編解碼器的設(shè)計(jì)與應(yīng)用研究
- 編解碼技術(shù)畢業(yè)設(shè)計(jì)
- asn.1編解碼器的實(shí)現(xiàn)及其與文本編碼的比較
- ADPCM編解碼系統(tǒng)設(shè)計(jì).pdf
- dlinkdvi高速圖像編解碼系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn) (1)
- ADPCM編解碼系統(tǒng)的ASIC設(shè)計(jì).pdf
- 基于OFDM系統(tǒng)的LDPC編解碼研究.pdf
評(píng)論
0/150
提交評(píng)論