2016-01-13 135 views
2
  1. 如何手動讀取asn文件編碼?
  2. 什麼是標籤長度值,是否有一個很好的教程?

在下面的例子我看他們每個人,但不乾淨對我來說,任何人都可以幫助閱讀他們每個人:手動讀取asn文件編碼

  1. 30 82 02 10 04 01 56 ...(更多的字節)

第一個字節是二進制的00110000。前兩位是00,所以類又是0.第三位是1,因此它是結構化的。最後五位是10000,所以標籤是16位十進制。下一個字節是82十六進制,它是十進制的130,它是128 + 2,後面的2個字節給出了長度。它們是02 10,它以「big-endian」格式解釋爲2 * 256 + 16 = 528。接下來的528個字節(從04 01 56開始)包含內容。

  • DF 82 02 05 12 34 56 78 90
  • 的第一個字節是二進制11011111。前兩位是11,所以這是第3類 - 私人。下一位是0,所以這是原始的。其餘五位全爲1,因此實際標籤從第二個字節開始。第二個字節是第一個字節,第三個字節不是,所以標記是通過取這兩個字節(二進制爲10000010 00000010),刪除它們的前導位以獲得十四位00000100000010,並將其解釋爲二進制數。因此,該標籤是十進制258。下一個字節是05,小於128,這是內容的實際長度。接下來的5個字節(12 34 56 78 90)是內容。

    的第一個字節,30,是一個我們以前見過。它是通用類,結構化,標籤爲16,下一個字節爲80,所以起初的長度是未知的。內容是所有以下字節,直到(但不包括)前兩個連續的零字節。所以內容是04 03 56 78 90,並且我們可以從內容弄清楚,長度爲5

    Examples Reference

    +0

    注意,有用於ASN.1幾個編碼規則。您似乎談論BER(基本編碼規則)或DER(區分編碼規則)。 – Henry

    +0

    基本編碼規則@Henry –

    回答

    2

    每個值被表示爲一個標記 - 長度 - 值在編碼三重。

    該標記在值的ASN.1數據定義中定義,並且在存在多種可能性(例如CHOICE值或可選值)的情況下識別值的種類很重要。

    長度以字節爲單位對合適值部分的長度進行編碼。

    該值是傳輸值的編碼。所使用的編碼根據值的類型而不同(例如,字符串使用與整數或對象標識符不同的編碼)。一般來說,您需要ASN.1定義才能理解值字節。在複合值的情況下,值部分中有零個或多個完整的值編碼(每個都有標籤長度值),例如SEQUENCE值的單個字段。

    谷歌搜索ASN.1 BER編碼顯示了很多資料,例如this one

    順便說一句:你的第三個例子有點誤導。長度不確定的值中的字節流需要被分割爲包含值(可能包含字節序列00 00)。只有當您在預期標籤的位置找到00 00時,這是該值結束的信號。因此需要分析內容04 03 56 78 90(標記04,長度03,值56 78 90)以確保接下來的00 00表示結束。

    編輯:

    Interpretation of the first example: 
    tag 30: bits 00 (UNIVERSAL) 1 (compound) 10000 (tag 16) 
    length 82 02 10: bits 1 (long length encoding) 0000010 (length uses 2 bytes) 
         00000010 00010000 (length in binary, 528 decimal) 
    
    Interpretation of the second example: 
    tag df 82 02: bits 11 (PRIVATE) 0 (primitive) 11111 (long tag encoding) 
         1 (there is a further tag byte) 0000010 (value 2) 
         0 (this is the last tag byte) 0000010 (value 2) 
         total tag value therefore 2*128 + 2 = 258 
    length 05: bits 0 (short length encoding) 0000101 (length in binary, decimal 5) 
    
    Interpretation of the third example: 
    tag 30: bits 00 (UNIVERSAL) 1 (compound) 10000 (tag value 16) 
    length 80: indefinite length, so we must look at the contained values 
        tag 04: bits 00 (UNIVERSAL) 0 (primitive) 00100 (tag value 4) 
        length 03: bits 0 (short length encoding) 0000011 (length value 3) 
        value 56 78 90 
    
        tag 00: signals end of indefinite length content as there is no 
          UNIVERSAL tag 0 
        length 00: dummy length byte of end marker 
    
    +0

    謝謝@亨利,你能解釋第一個和第二個例子之間的區別是什麼 –

    +0

    它只是一個不同的標籤類,在第一種情況下,標籤是[UNIVERSAL 16],就像你說的SEQUENCE或SEQUENCE OF ,第二種情況是[私人258]。您需要該值的ASN.1定義才能知道私有標記值的含義。 – Henry

    +0

    在第一個示例中, TAG:30以二進制00110000 -比特8和7意味着 - >通用 - 比特6意味着 - >構造的 - 比特5..1意味着 - > SEQUENCE或SEQUENCE OF LENGTH:82 in binary = 10000010 and Decimal = 130 so 130-128 = 2 So Dec 10 = 528 所以VALUE =接下來的528字節。 對不對? –