共找到2條詞條名為BER的結果 展開

BER

計算機術語

基本編碼規則,定義在ITU-TX.209中,是指在ASN.1標準(定義在ITU-TX.208中)中描述的數據編碼/解碼規則。基本的編碼規則可能被用於為類型值取得傳輸語法的規範,使用ASN.1指定在推薦X.208中定義的。一單個ASN.1對象可能有幾個等價的BER編碼。BER是當前CryptoAPI使用的兩種編碼方法之一。

基本簡介


編碼規,描述.類型值編碼節串()。
SNMP編碼()。據域構:標識域()+域()+值域()。簡稱式。.,稱--()。

編解碼原理

設計
信令中繼系統是電信7號信令網中基於事務處理能力(TransactionCAPabilities,簡稱TCAP)開發的系統,它完成香港某電信虛擬運營商和其依賴的實際運營商之間信令消息的轉換,在不需要建立新的國際漫遊鏈路情況下,實現虛擬運營商的手機用戶國際漫遊的功能。TCAP層的信令數據是由ASN.1定義的,使用ASN.1基本編碼規則BER(BasicEncodingRules,簡稱BER)進行傳輸,所以需要根據BER進行解碼和編碼。

編解碼模塊內容

為了使編解碼模塊具有良好的通用性和擴展性,將其設計成標準C語言的函數庫形式,這樣可以在多種操作系統和多種編程語言中重用。ASN.1編解碼模塊分為三個部分:(1)簡單數據類型的編解碼函數;(2)內存函數;(3)輔助函數。
簡單數據類型的編碼函數為外部提供統一的API介面。信令轉換模塊利用這些函數對TCAP數據單元進行編碼和解碼,如果是複合類型,則分解成基本數據類型進行編碼解碼
編碼函數形式是:
intASNEncode_<數據類型>(ASNCONTEXT*pCtx,<數據類型對應的C結構>*pObj,intTagType),將C結構內的數據編碼到緩衝區中。
解碼函數形式是:
intASNDecode_<數據類型>(ASNCONTEXT*pCtx,<數據類型對應的C結構>*pObj,intTagType),將緩衝區內的數據解碼到數據結構中。
內存函數主要是進行內存的分配和管理。
輔助函數主要是進行編碼錯誤的處理。

數據結構

為了能建立庫函數之間的聯繫,需要跟蹤函數調用時的有關參數,如編碼解碼緩衝區的變化、運行時的錯誤信息等。所以,在每個編解碼函數里增加一個編解碼上下文結構參數ASNCONTEXT,以保證複合類型編解碼和內存處理的正確性。定義了一個初始化上下結構的函數InitContext(ASNCONTEXT*),在聲明一個上下文結構的變數后,調用此函數上下文進行初始化,然後再調用編解碼函數。

內存分配和管理

一般而言,C語言中有下面兩種方法進行內存分配:(1)在棧上分配變數,然後將變數的地址傳給指針欄位;(2)使用標準的malloc和free兩個C函數動態分配內存。第一種方法比較簡單,可以得到臨時內存,不再需要時可以釋放。但是,這樣很不安全,容易出現懸空指針。第二種方法沒有這個問題,在調用完編碼函數后可以安全釋放每個元素的內存。但是,對每個malloc調用都要有free調用。對於複雜的結構,很難做到這點,可能會導致內存泄漏
採用的方法是使用庫內存管理函數進行分配和釋放內存緩衝區。相比第二種方法,其最大的優點是只需調用一個簡單的MemFreeAll函數就可以釋放所有分配的內存。具體做法是,在上下文結構中跟蹤所有分配的內存,當MemFreeAll調用時,所有內存立刻釋放。另外,動態分配內存是從一小塊連續內存池中分配,同時由一個MEM_POOL結構記錄內存池的起始地址、大小以及當前指針。最初,該指針指向內存池的開始處,分配內存時,指針向前移動需要的長度。用這種方式分配的內存不會顯式地釋放,只有當指針重新設置為內存池的開始時才釋放。釋放的方法也很簡單,只要賦值操作就可完成。
BER編碼是從緩衝區的結尾開始向前構造編碼,編碼完成後起始指針會落在緩衝區的中間。使用這樣的編碼技巧,可以方便地得到編碼后數據的起始地址和長度。

對比介紹


網路通信中,大多數實際網路都採用了多個製造商的設備,這些設備所採用的“局部語法”(如:硬體體系結構、程序語言定義以及具體程序的編製等)都是不一樣的。這些差異就決定了同一數據對象在不同的計算機上被表示為不同的符號串。為了使多個製造商設備之間能夠實現互通,就必須引入“傳送語法”,它是一種標準的、與具體的網路環境無關的語法格式。對於傳送語法的要求有以下三點:(1)必須能夠定義各種複雜的類型;(2)必須能夠精確說明這些類型的值;(3)需要提供一種以上的編碼規則,這種編碼規則能夠確定會話層用何種比特模式來表示應用層的數據的值。
PER與BER的對比:
由於BER的編碼包含了過多的冗餘信息,使得網路傳輸負荷過大。ITU-T在90年代初又制定了PER編碼。X.691中把PER的編碼又分為alignedvariant和unalignedvariant這兩種情況。其中,unalignedvariant的編碼都是按比特來的,各個數據項的編碼之間沒有填充的比特,因此它比alignedvariant更為精簡。但這種編碼的結果沒有從位元組的邊界處開始,實現起來不方便,而且也將佔用更多的CPU時間。
與BER編碼比較,PER編碼的精簡主要來自於以下三方面:

沒有T欄位

T欄位在編碼中似乎是一個重要部分,但實際上通常是不必要的。由於網路的通信雙方都遵循統一的網路協議,因此它們可以從數據結構中推導出特定元素的類型和標識,就可以在編碼中省略類型標識符。

長度段的編碼

更加精簡
BER的長度段的編碼都是位元組,而且BER長度的編碼不考慮具體條件;然而PER的長度欄位根據編碼類型的不同,有不同的單位。這些單位可以是比特、位元組、元素、字元等。這也是PER利用數據結構已知的優勢來減少編碼量的又一種方式;而且根據具體的條件限制,PER的長度段還可以大幅度削減,譬如當數據類型的長度固定時,該數據項的長度甚至可以不編碼。IA5String(SIZE(4)):=“BCDA”,由於長度固定為4,PER編碼就只對BCDA進行編碼,共4位元組。而BER則還要包括T和L欄位,共6位元組。
PER長度段的編碼規則也要複雜得多,這方面的論述在X.691中佔據了相當大的篇幅。

對數字類型的編碼

更加精簡
在對Integer等數字類型(包括Integer和一些類型的長度值編碼的情況)進行編碼時,BER採取的是直接對數值進行編碼;而PER採取的是對數據的偏移值(offset)進行編碼。所謂偏移值就是實際值減去下界的值。Integer(123456789…123456792):=123456790,offset=1,PER只需要對1進行編碼,編碼結果為“01”,佔兩個比特。而PER就要對1234567690進行編碼,編碼結果為包括TLC三個欄位共需要6個位元組。這樣對於那些下界類型很大的整數,可以節省大量位元組,且編碼本身也非常簡潔。