读取手动编码asn文件

时间:2016-01-13 12:43:21

标签: encode asn.1 tlv ber

  1. 如何手动读取asn文件?
  2. Tag-Length-Value是什么,有没有很好的教程?
  3. 在以下示例中,我阅读了每个示例,但不为我清理,任何人都可以帮助阅读每个示例:

    1. 30 82 02 10 04 01 56 ...(更多字节)
    2.   

      第一个字节是二进制的00110000。前两位是00,因此类再次为0.第三位为1,因此它是结构化的。最后五位是10000,因此标记为十进制16。下一个字节是82十六进制,即十进制130,即128 + 2,后面的2个字节给出长度。它们是02 10,以“big-endian”格式解释为2 * 256 + 16 = 528.接下来的528个字节,从04 01 56开始,包含内容。

      1. df 82 02 05 12 34 56 78 90
      2.   

        第一个字节是二进制的11011111。前两位是11,所以这是3级 - 私有。下一位是0,所以这是原始的。其余五位全部为1,因此实际标记从第二个字节开始。第二个字节有一个前导字节,第三个字节没有,所以标记是通过取这两个字节(二进制10000010 00000010),丢弃它们的前导位以获得十四位00000100000010,并将其解释为二进制数来构造的。 。因此,标记为小数点后258。下一个字节是05,小于128,因此这是内容的实际长度。接下来的5个字节(12 34 56 78 90)是内容。

        1. 30 80 04 03 56 78 90 00 00
        2.   

          第一个字节30是我们以前见过的字节。它是通用类,结构化,带有标记16.下一个字节是80,所以最初的长度是未知的。内容是以下所有字节,最多(但不包括)前两个连续的零字节。所以内容是04 03 56 78 90,我们可以从内容中找出长度是5。

          Examples Reference

1 个答案:

答案 0 :(得分:2)

每个值在编码中表示为标签 - 长度 - 值三倍。

标记在值的ASN.1数据定义中定义,并且在有多个可能性(例如CHOICE值或可选值)的情况下识别值的类型很重要。

长度以字节为单位对正确值部分的长度进行编码。

该值是传输值的编码。使用的编码根据值的类型而变化(例如,String使用与整数或对象标识符不同的编码)。通常,您需要ASN.1定义才能理解值字节。在复合值的情况下,值部分中存在零个或多个完整值编码(每个都具有tag-length-value),例如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
相关问题