

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