ANS1編碼詳解(二) 編碼規則

2021-07-25 08:40:52 字數 2017 閱讀 1476

基本編碼規則(basicencodingrules)asn.1的基本編碼規則定義了一種或多種把任意asn.1

值表示成位元組字串的方法,縮寫為ber。(當然還有其它的方法,但是ber是osi中轉換這些值的標準)

使用ber,乙個asn.1的值有三種編碼方法,選擇哪種取決於值的型別和值的長度是否已知。這三種方法是:簡單定長編碼,結構化定長編碼,及結構化不定長編碼。簡單的non-string型別使用第一種(簡單定長編碼);結構化型別可使用任一種結構化的編碼方法;簡單的string型別根據值的長度是否已知可使用任一

種方法。隱式標籤定義的型別可使用下層型別的方法,顯式標籤定義的型別使用結構化的編碼方法。每種ber編碼方法都有三或四部分:

identifier octets(以下簡稱_id):定義了asn.1值的類和標籤值,指明編碼方法是簡單的還是結構化的。(這個就相當於tlv格式的tag)

length octets(以下簡稱_length):對於定長編碼方法,它指出了內容位元組個數;對於結構化非定長編碼方法,它指明長度是不確定的。(這個就相當於tlv格式的length)

contents octets(以下簡稱_content):對於簡單定長編碼方法,它給出了值的具體表示;對於結構化的方法,它給出了值內容的ber編碼的串聯。(這個就相當於tlv格式的value)

end-of-contents pctets (以下簡稱_end):對於結構化非定長的編碼方法,它表示內容結束;對於其它方法,沒有該部分。

在下面的章節中介紹了這三種編碼方法。(這個是結束符號)

一、簡單定長編碼low-tag-num:bit5-bit1表示_id值

high-tag-num: 大端法表示,第乙個位元組bit5-bit1全部置1,其餘每個位元組bit8置1其餘位表示_id值,最後一位bit8為0表示結束

例如 通用的簡單編碼型別9(low-tag-num) 和 42、129(high-tag-num)

9的bit表示:

42的bit表示:

129的bit表示

_length:有兩種表示方式,一種是短型別(short form)一種是長型別(long form),以128為界限。

短型別:bit8為0,其餘位表示長度

長型別:第乙個位元組bit8為1,其餘位表示長度的位元組數,隨後的位元組給出長度

例如:20 和200

20的bit表示:

200的bit表示:

_contents:具體的內容,這個後面再說

3.2 結構化定長方法( constructed, definite-length method)

結構化定長方法適用於簡單的 string 型別、 結構型別、 在二者基礎上通過隱式標籤生成

的型別和在任何型別基礎上由顯式標籤生成的型別。 要求值的長度事先已知。 ber 編碼方

法各部分如下:

_id:同簡單編碼,不過第乙個位元組的bit6為1

_length:同簡單編碼

contents:值的元件的 ber 編碼的串聯

對於簡單string型別和在其基礎上由隱式標籤生成的型別, 是值的連續子串的ber編碼的串聯(隱式標籤的下層值);

對於結構型別和在其基礎上由隱式標籤生成的型別, 是值的元件的ber編碼的串聯(隱式標籤的下層值);

對於在任何型別基礎上使用顯式標籤生成的型別,是下層值的ber編碼。

具體的以後再說

3.3結構化非定長方法( constructed, indefinite-length method)

結構化的、 非定長編碼用於簡單 string 型別、 結構型別、 在二者基礎上使用隱式標籤生成的型別和在任何型別基礎上使用顯式標籤生成的型別。不要求事先知道值的長度。 ber編碼各部分如下:

identifier octets, 見第 3.2 節

length octets.乙個位元組,值為 80

contents octets.見第 3.2 節。

end-of-contents octets 兩個位元組,為 00 00。

ANS 1編碼詳解(一) 基礎語法和資料型別

ans.1是一種跨平台的編碼格式,網上關於ans.1協議的實現一抓一大把,openssl裡面有ans.1的實現,大家感興趣的可以去看看。我們這裡主要是講講ans.1編碼,這樣大家看 的時候更容易理解一些,它的組成有點類似xml和tlv有多層的巢狀。asn.1語法遵循傳統的巴科斯正規化bnf風格 最基...

DER編碼規則詳解

der是ber的子集,它為每乙個asn.1型別定義一種唯一的編碼方案。der在ber的基礎上增加了如下限制 長度小於等於127,必須使用短型長度表示法。長度大於127,必須使用長型長度表示法,並且要盡可能的短。對於簡單的string型別以及在其基礎上隱性標籤生成的型別使用簡單定長表示法。對於結構化型...

C 編碼規範(1) 命名規則

pascal 大小寫形式 所有單詞第乙個字母大寫,其他字母小寫。camel 大小寫形式 除了第乙個單詞,所有單詞第乙個字母大寫,其他字母小寫。1.類名使用pascal 大小寫形式 public class helloworld 2.方法使用pascal 大小寫形式 public class hell...