專(zhuān)利名稱(chēng):一種編碼的處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種網(wǎng)絡(luò)通信技術(shù),尤其涉及一種編碼的處理方法。
背景技術(shù):
OPENTYPE(開(kāi)放類(lèi)型)是ASN1(抽象語(yǔ)法名稱(chēng))描述中的一種數(shù)據(jù)類(lèi)型,含義是該數(shù)據(jù)類(lèi)型和長(zhǎng)度不定。在編碼的時(shí)候,這種數(shù)據(jù)類(lèi)型的碼流分兩部分,先對(duì)該數(shù)據(jù)類(lèi)型的編碼碼流的長(zhǎng)度進(jìn)行編碼,然后對(duì)該數(shù)據(jù)的正文進(jìn)行編碼。下面舉例說(shuō)明如下表所示,一條消息有3個(gè)IE(信息單元),IE1和IE2屬于SEQUENCE類(lèi)型,IE3屬于OPENTYPE類(lèi)型,
編碼之后,如果把IE1的編碼碼流叫做編碼1,把IE2的編碼碼流叫做編碼2,把IE3內(nèi)容的編碼碼流叫做編碼3,這條消息編碼之后,碼流的內(nèi)容依次是編碼1、編碼2、編碼3的長(zhǎng)度編碼、編碼3,各個(gè)編碼的存放位置如下表所示
如果IE3內(nèi)容的編碼(編碼3)長(zhǎng)度在0-127之間,那么它的長(zhǎng)度編碼占用1個(gè)字節(jié);如果IE3內(nèi)容的編碼(編碼3)長(zhǎng)度在128-16383個(gè)字節(jié)之間,則它的長(zhǎng)度編碼占用2個(gè)字節(jié);如果IE3內(nèi)容的編碼(編碼3)長(zhǎng)度在16384個(gè)字節(jié)以上,則它的長(zhǎng)度編碼占用多個(gè)字節(jié)。也就是說(shuō)編碼3長(zhǎng)度的編碼占用的字節(jié)數(shù)目不是固定的,而由編碼3的長(zhǎng)度決定。在編碼的時(shí)候需要先對(duì)長(zhǎng)度編碼再對(duì)內(nèi)容編碼,長(zhǎng)度的數(shù)值是多少,需要對(duì)內(nèi)容編完碼之后才能知道,也就是說(shuō)內(nèi)容編碼完成之后,才知道長(zhǎng)度需要占用多少字節(jié),內(nèi)容從哪里開(kāi)始存放。這里就需要尋找一種方法,提高OPENTYPE的編碼速度。
由于需要對(duì)IE3的內(nèi)容編碼完成之后,才能知道長(zhǎng)度的值,所以需要先在另一塊內(nèi)存位置對(duì)IE3的內(nèi)容進(jìn)行編碼,而IE3中還有可能存在OPENTYPE類(lèi)型,所以需要使用一個(gè)內(nèi)存棧。當(dāng)編碼過(guò)程中遇到OPENTYPE類(lèi)型的時(shí)候,將當(dāng)前的編碼操作壓棧,然后對(duì)OPENTYPE類(lèi)型進(jìn)行編碼,如果當(dāng)前OPENTYPE中還包含一個(gè)OPENTYPE,再進(jìn)行壓棧編碼操作。一個(gè)OPENTYPE類(lèi)型編碼完成之后,將其彈出棧,在下一層中對(duì)其長(zhǎng)度編碼,然后放入已經(jīng)編碼的碼流。
下面舉例說(shuō)明現(xiàn)有技術(shù)編碼碼流的處理方法第一步將IE1和IE2進(jìn)行編碼,編碼內(nèi)存中的存放位置如下所示
第二步將當(dāng)前的編碼過(guò)程壓棧,在上一層內(nèi)存中對(duì)IE3的內(nèi)容進(jìn)行編碼。編碼內(nèi)存的存放位置如下所示
第三步對(duì)IE3的內(nèi)容編碼完成之后,得到編碼3的長(zhǎng)度,將編碼棧彈出,然后對(duì)長(zhǎng)度編碼,放到編碼2之后。編碼內(nèi)存的存放位置如圖
第四步將編碼3的內(nèi)容放到長(zhǎng)度編碼的后面,完成消息的編碼。
如果在對(duì)IE3的編碼過(guò)程中又遇到OPENTYPE類(lèi)型,編碼過(guò)程壓棧,使用再上一層內(nèi)存,重復(fù)2-4步。OPENTYPE類(lèi)型處理結(jié)束之后,再繼續(xù)對(duì)IE3內(nèi)容編碼。
從上面的編碼過(guò)程可以看出,遇到OPENTYPE類(lèi)型的時(shí)候,就需要壓棧,使用一塊新的內(nèi)存,如果嵌套有N層OPENTYPE,就需要N層的棧,而棧的每一層都是相同大小的,其大小取決于編碼過(guò)程中最大的碼流長(zhǎng)度。所以這種方式對(duì)內(nèi)存的消耗很大。
在對(duì)編碼3的長(zhǎng)度編碼完成之后,需要將編碼3的碼流從一塊內(nèi)存拷貝到另一塊內(nèi)存,如果IE3中還存在OPENTYPE,那么在對(duì)IE3進(jìn)行編碼過(guò)程中也會(huì)有碼流拷貝發(fā)生。如果有N層的OPENTYPE,那么最深處的OPENTYPE就需要拷貝N次,上面一層OPENTYPE需要拷貝N-1次,以此類(lèi)推。這種內(nèi)存拷貝極大地耗費(fèi)了運(yùn)行時(shí)間,降低了運(yùn)行效率。
發(fā)明內(nèi)容
針對(duì)現(xiàn)有技術(shù)的上述缺陷,本發(fā)明的目的是提供一種編碼的處理方法,從而提高了運(yùn)行效率,節(jié)省了內(nèi)存空間。
本發(fā)明是通過(guò)下述技術(shù)方案實(shí)現(xiàn)的,本發(fā)明提供了一種編碼的處理方法,包括A、在編碼過(guò)程中,對(duì)于開(kāi)放類(lèi)型的數(shù)據(jù)單元,在編碼緩沖區(qū)存放其預(yù)定長(zhǎng)度;B、對(duì)開(kāi)放類(lèi)型的數(shù)據(jù)進(jìn)行編碼,將其存放在預(yù)定長(zhǎng)度后面,同時(shí)獲得所述開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度;
C、根據(jù)所述開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度移動(dòng)編碼。
所述預(yù)定長(zhǎng)度包括特定長(zhǎng)度和經(jīng)驗(yàn)長(zhǎng)度。
所述經(jīng)驗(yàn)長(zhǎng)度由下述公式確定經(jīng)驗(yàn)長(zhǎng)度=原來(lái)的經(jīng)驗(yàn)長(zhǎng)度*(1-m)+新長(zhǎng)度*m其中m為權(quán)重。
所述經(jīng)驗(yàn)長(zhǎng)度存放在經(jīng)驗(yàn)長(zhǎng)度數(shù)組中。
所述的步驟C具體包括若開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度所需存儲(chǔ)單元數(shù)量L1大于經(jīng)驗(yàn)長(zhǎng)度所需存儲(chǔ)單元數(shù)量L2,則將編碼向后移動(dòng)L1-L2單元。
所述的步驟C具體包括若開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度所需存儲(chǔ)單元數(shù)量L1與經(jīng)驗(yàn)長(zhǎng)度所需存儲(chǔ)單元數(shù)量L2相同,則不移動(dòng)編碼。
所述的步驟C具體包括若開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度所需存儲(chǔ)單元數(shù)量L1小于經(jīng)驗(yàn)長(zhǎng)度所需存儲(chǔ)單元數(shù)量L2,則將編碼向前移動(dòng)L2-L1單元。
所述存儲(chǔ)單元單位為字節(jié)。
根據(jù)本發(fā)明的編碼處理方法,可避免不必要的內(nèi)存拷貝,高效率地對(duì)OPENTYPE類(lèi)型進(jìn)行編碼,并且占用盡可能少的內(nèi)存空間。
圖1示出了一條消息的結(jié)構(gòu)示意圖。
具體實(shí)施例方式
為了便于本領(lǐng)域一般技術(shù)人員理解和實(shí)現(xiàn)本發(fā)明,現(xiàn)結(jié)合附圖描繪本發(fā)明的實(shí)施例。
根據(jù)本發(fā)明,申請(qǐng)一塊內(nèi)存,用作存放編碼碼流的緩沖區(qū)。按照ASN1描述的內(nèi)容,依次對(duì)每一個(gè)IE進(jìn)行編碼,當(dāng)遇到OPENTYPE類(lèi)型的時(shí)候,按照下面的描述處理把編碼緩沖區(qū)中下一個(gè)將要存放的字節(jié)稱(chēng)之為當(dāng)前字節(jié)。在對(duì)OPENTYPE內(nèi)容進(jìn)行編碼的時(shí)候,內(nèi)容的編碼仍然保存在當(dāng)前的緩沖區(qū)中,起始位置為當(dāng)前字節(jié)向后偏移若干個(gè)字節(jié)。完成內(nèi)容的編碼之后,得到PER(壓縮編碼規(guī)則)碼流長(zhǎng)度,判斷長(zhǎng)度,如果長(zhǎng)度在0-127之間,長(zhǎng)度編碼占用一個(gè)字節(jié);如果長(zhǎng)度在128-16383之間,長(zhǎng)度編碼占用兩個(gè)字節(jié);如果長(zhǎng)度大于16384,則長(zhǎng)度編碼占用多個(gè)字節(jié)。判斷占用字節(jié)的情況,如果長(zhǎng)度編碼正好占用預(yù)先空出來(lái)的字節(jié)空間,則不需要移動(dòng)內(nèi)容PER碼流;如果長(zhǎng)度編碼很短,放不滿(mǎn)預(yù)先空出來(lái)的字節(jié),需要將內(nèi)容的PER碼流向左移動(dòng);如果編碼很長(zhǎng),預(yù)先空出來(lái)的字節(jié)放不下長(zhǎng)度編碼,需要將內(nèi)容的PER碼流向右移動(dòng)。然后放入長(zhǎng)度編碼,將當(dāng)前編碼指針?lè)诺絻?nèi)容編碼之后,這就完成了一個(gè)協(xié)議容器的編碼。
下面舉一個(gè)例子來(lái)說(shuō)明對(duì)OPENTYPE類(lèi)型的編碼過(guò)程圖1示出了一條消息的結(jié)構(gòu)層次,該消息結(jié)構(gòu)包含有一個(gè)OPENTYPE11,OPENTYPE11中又包含一個(gè)OPENTYPE21。下面描述其編碼過(guò)程第一步對(duì)IE1進(jìn)行編碼,編碼完成后編碼緩沖區(qū)如下所示
第二步給長(zhǎng)度編碼預(yù)留若干個(gè)字節(jié)(為了方便描述,這里假設(shè)預(yù)留一個(gè)字節(jié),如何計(jì)算預(yù)留字節(jié)將在后面描述),開(kāi)始對(duì)OPENTYPE11的內(nèi)容進(jìn)行編碼。OPENTYPE11的第一個(gè)成員是IE21,完成對(duì)IE21的編碼。編碼緩沖區(qū)如下所示
第三步這時(shí)候又遇到一個(gè)OPENTYPE21,需要嵌套使用OPENTYPE的編碼方法進(jìn)行編碼。給長(zhǎng)度編碼預(yù)留若干字節(jié)(為了方便描述,這里假設(shè)預(yù)留兩個(gè)字節(jié),如何計(jì)算預(yù)留字節(jié)將在后面描述),開(kāi)始對(duì)OPENTYPE21的內(nèi)容進(jìn)行編碼。OPENTYPE21的第一個(gè)成員是IE31,完成對(duì)IE31的編碼。編碼緩沖區(qū)如下圖所示
第四步IE31編碼完成之后,OPENTYPE21內(nèi)容編碼的長(zhǎng)度就可以知道了,我們這里假設(shè)OPENTYPE21的內(nèi)容編碼長(zhǎng)度為100個(gè)字節(jié),那么OPENTYPE21的長(zhǎng)度編碼只需要占用1個(gè)字節(jié),而編碼之前我們預(yù)留了兩個(gè)字節(jié),所以在對(duì)長(zhǎng)度編碼之前,需要將內(nèi)容編碼向左移動(dòng)1個(gè)字節(jié),然后放入長(zhǎng)度編碼。編碼緩沖區(qū)如下所示
第五步這時(shí)候,OPENTYPE11的內(nèi)容也完成了編碼,OPENTYPE11內(nèi)容編碼的長(zhǎng)度就可以知道了,我們這里假設(shè)OPENTYPE21的內(nèi)容編碼長(zhǎng)度為200個(gè)字節(jié),那么OPENTYPE11的長(zhǎng)度編碼就需要占用2個(gè)字節(jié),而編碼之前我們只預(yù)留了1個(gè)字節(jié),所以在對(duì)長(zhǎng)度編碼之前,需要將內(nèi)容編碼向右移動(dòng)1個(gè)字節(jié),然后放入長(zhǎng)度編碼。編碼緩沖區(qū)如下圖所示
第六步對(duì)IE12進(jìn)行編碼,完成之后,整個(gè)消息的編碼就完成了。編碼緩沖區(qū)如下圖所示
從上面的操作描述中可以看出,在開(kāi)始對(duì)內(nèi)容編碼之前,需要判斷預(yù)留多少字節(jié)用于長(zhǎng)度編碼,判斷是否準(zhǔn)確,將決定是否需要移動(dòng)內(nèi)容的PER碼流,直接影響編碼的效率。為了增加判斷預(yù)留字節(jié)的正確性,在編碼過(guò)程中,可以記錄下以往該P(yáng)DU(協(xié)議數(shù)據(jù)單元)的編碼長(zhǎng)度,我們稱(chēng)之為經(jīng)驗(yàn)長(zhǎng)度,根據(jù)經(jīng)驗(yàn)長(zhǎng)度,來(lái)決定預(yù)留多少字節(jié),增加命中概率。下面是具體實(shí)現(xiàn)方法
使用一個(gè)數(shù)組,數(shù)組的個(gè)數(shù)為協(xié)議中OPENTYPE的總個(gè)數(shù),再給每一個(gè)OPENTYPE一個(gè)序號(hào),使用序號(hào)作為數(shù)組下標(biāo),這樣每一個(gè)OPENTYPE就對(duì)應(yīng)一個(gè)數(shù)組成員,每一個(gè)數(shù)組成員中記錄該OPENTYPE的經(jīng)驗(yàn)長(zhǎng)度。在初始的時(shí)候,給數(shù)組中每一個(gè)成員賦值為127,以后每一個(gè)OPENTYPE編碼完成之后,得到長(zhǎng)度,更新這個(gè)OPENTYPE的經(jīng)驗(yàn)長(zhǎng)度記錄。為了防止出現(xiàn)乒乓現(xiàn)象,在更新經(jīng)驗(yàn)長(zhǎng)度的時(shí)候,不是使用新的長(zhǎng)度替代原有的長(zhǎng)度,而是和原來(lái)的長(zhǎng)度取加權(quán)平均。假設(shè)新的長(zhǎng)度權(quán)重為m,0<m<1,則經(jīng)驗(yàn)長(zhǎng)度=原來(lái)經(jīng)驗(yàn)長(zhǎng)度*(1-m)+新長(zhǎng)度*m。
新長(zhǎng)度的權(quán)重m的大小可表示新數(shù)據(jù)與原來(lái)數(shù)據(jù)之間的相關(guān)關(guān)系??筛鶕?jù)新數(shù)據(jù)與原來(lái)數(shù)據(jù)之間的相關(guān)程度,來(lái)調(diào)整新長(zhǎng)度的權(quán)重m,例如可取m=0.8。
每次在對(duì)OPENTYPE編碼之前,就是用這個(gè)數(shù)組中記錄的經(jīng)驗(yàn)長(zhǎng)度來(lái)判斷需要預(yù)留多少字節(jié)作為長(zhǎng)度編碼。由于消息中選取的IE并不是每次都相同,所以同一個(gè)OPENTYPE的編碼長(zhǎng)度并不是總是不變的,而我們關(guān)心的是長(zhǎng)度編碼是1字節(jié)、2字節(jié)還是多字節(jié),使用這種加權(quán)平均的方法,可以使絕大多數(shù)情況下長(zhǎng)度編碼的字節(jié)數(shù)估計(jì)是正確的。
根據(jù)本發(fā)明,在對(duì)OPENTYPE編碼時(shí),還可采用下述方案,可先假定OPENTYPE的數(shù)據(jù)長(zhǎng)度為任一特定值,然后對(duì)OPENTYPE編碼,在編碼過(guò)程中,可獲得OPENTYPE數(shù)據(jù)的長(zhǎng)度,然后根據(jù)OPENTYPE數(shù)據(jù)長(zhǎng)度所占用的字節(jié)來(lái)決定是否移動(dòng)OPENTYPE編碼。若開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度所需存儲(chǔ)單元數(shù)量L1大于經(jīng)驗(yàn)長(zhǎng)度所需存儲(chǔ)單元數(shù)量L2,則將編碼向后移動(dòng)L1-L2單元;若開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度所需存儲(chǔ)單元數(shù)量L1與經(jīng)驗(yàn)長(zhǎng)度所需存儲(chǔ)單元數(shù)量L2相同,則不移動(dòng)編碼;若開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度所需存儲(chǔ)單元數(shù)量L1小于經(jīng)驗(yàn)長(zhǎng)度所需存儲(chǔ)單元數(shù)量L2,則將編碼向前移動(dòng)L2-L1單元。最后,將OPENTYPE數(shù)據(jù)的實(shí)際長(zhǎng)度放在預(yù)留的位置上。
當(dāng)OPENTYPE數(shù)據(jù)有多層嵌套時(shí),依次算出每層OPENTYPE數(shù)據(jù)的長(zhǎng)度,然后,根據(jù)算出的實(shí)際長(zhǎng)度來(lái)移動(dòng)OPENTYPE數(shù)據(jù),最后將OPENTYPE數(shù)據(jù)的實(shí)際長(zhǎng)度放在預(yù)留的位置上。
根據(jù)本發(fā)明,編碼過(guò)程中所有的OPENTYPE都是在相同的編碼緩沖區(qū)中完成,不需要臨時(shí)存放OPENTYPE內(nèi)容編碼的緩沖區(qū),從而使OPENTYPE嵌套層數(shù)與所需要的緩沖區(qū)關(guān)系不大。因此,節(jié)省了編碼過(guò)程中使用的內(nèi)存空間。
此外,通過(guò)使用加權(quán)平均的方法計(jì)算經(jīng)驗(yàn)長(zhǎng)度,可以滿(mǎn)足在絕大多數(shù)情況下編碼長(zhǎng)度的估計(jì)是正確的。因此,在絕大多數(shù)情況下,不需要移動(dòng)內(nèi)容編碼,從而避免了編碼過(guò)程中耗費(fèi)不必要的時(shí)間,提高編碼效率,節(jié)約編碼時(shí)間。
雖然通過(guò)實(shí)施例描繪了本發(fā)明,但本領(lǐng)域普通技術(shù)人員知道,在不脫離本發(fā)明的精神和實(shí)質(zhì)的情況下,就可使本發(fā)明有許多變形和變化,本發(fā)明的范圍由所附的權(quán)利要求來(lái)限定。
權(quán)利要求
1.一種編碼的處理方法,其特征在于,包括A、在編碼過(guò)程中,對(duì)于開(kāi)放類(lèi)型的數(shù)據(jù)單元,在編碼緩沖區(qū)存放其預(yù)定長(zhǎng)度;B、對(duì)開(kāi)放類(lèi)型的數(shù)據(jù)進(jìn)行編碼,將其存放在預(yù)定長(zhǎng)度后面,同時(shí)獲得所述開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度;C、根據(jù)所述開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度移動(dòng)編碼。
2.根據(jù)權(quán)利要求1所述的編碼的處理方法,其特征在于,所述預(yù)定長(zhǎng)度包括特定長(zhǎng)度和經(jīng)驗(yàn)長(zhǎng)度。
3.根據(jù)權(quán)利要求2所述的編碼的處理方法,其特征在于,所述經(jīng)驗(yàn)長(zhǎng)度由下述公式確定經(jīng)驗(yàn)長(zhǎng)度=原來(lái)的經(jīng)驗(yàn)長(zhǎng)度*(1-m)+新長(zhǎng)度*m其中m為權(quán)重。
4.根據(jù)權(quán)利要求2所述的編碼的處理方法,其特征在于,所述經(jīng)驗(yàn)長(zhǎng)度存放在經(jīng)驗(yàn)長(zhǎng)度數(shù)組中。
5.根據(jù)權(quán)利要求2、3或4所述的編碼的處理方法,其特征在于,所述的步驟C具體包括若開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度所需存儲(chǔ)單元數(shù)量L1大于經(jīng)驗(yàn)長(zhǎng)度所需存儲(chǔ)單元數(shù)量L2,則將編碼向后移動(dòng)L1-L2單元。
6.根據(jù)權(quán)利要求2、3或4所述的編碼的處理方法,其特征在于,所述的步驟C具體包括若開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度所需存儲(chǔ)單元數(shù)量L1與經(jīng)驗(yàn)長(zhǎng)度所需存儲(chǔ)單元數(shù)量L2相同,則不移動(dòng)編碼。
7.根據(jù)權(quán)利要求2、3或4所述的編碼的處理方法,其特征在于,所述的步驟C具體包括若開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度所需存儲(chǔ)單元數(shù)量L1小于經(jīng)驗(yàn)長(zhǎng)度所需存儲(chǔ)單元數(shù)量L2,則將編碼向前移動(dòng)L2-L1單元。
8.根據(jù)權(quán)利要求2所述的編碼的處理方法,其特征在于,所述存儲(chǔ)單元單位為字節(jié)。
全文摘要
本發(fā)明公開(kāi)了一種編碼的處理方法,包括在編碼過(guò)程中,對(duì)于開(kāi)放類(lèi)型的數(shù)據(jù)單元,在編碼緩沖區(qū)存放其預(yù)定長(zhǎng)度;對(duì)開(kāi)放類(lèi)型的數(shù)據(jù)進(jìn)行編碼,將其存放在預(yù)定長(zhǎng)度后面,同時(shí)獲得所述開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度;根據(jù)所述開(kāi)放類(lèi)型的數(shù)據(jù)的長(zhǎng)度移動(dòng)編碼。因此,避免了不必要的內(nèi)存拷貝,可高效率地對(duì)OPENTYPE類(lèi)型進(jìn)行編碼,并且占用盡可能少的內(nèi)存空間。
文檔編號(hào)H04L29/06GK1842082SQ20051005992
公開(kāi)日2006年10月4日 申請(qǐng)日期2005年4月1日 優(yōu)先權(quán)日2005年4月1日
發(fā)明者朱偉 申請(qǐng)人:華為技術(shù)有限公司