【问题标题】:Reading encode asn file manually手动读取编码 asn 文件
【发布时间】:2016-01-13 12:43:21
【问题描述】:
  1. 如何手动读取编码 asn 文件?
  2. 什么是Tag-Length-Value,有好的教程吗?

在以下示例中,我阅读了每个示例,但没有为我清理,任何人都可以帮助阅读每个示例:

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

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

  1. 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)是内容。

  1. 30 80 04 03 56 78 90 00 00

第一个字节 30 是我们以前见过的。它是通用类,结构化,标签为 16。下一个字节是 80,所以长度一开始是未知的。内容是所有后续字节,直到(但不包括)前两个连续的零字节。所以内容是04 03 56 78 90,从内容中可以看出长度是5。

Examples Reference

【问题讨论】:

  • 请注意,ASN.1 有几个编码规则。您似乎在谈论 BER(基本编码规则)或 DER(可区分编码规则)。
  • 基本编码规则@Henry

标签: encode asn.1 tlv ber


【解决方案1】:

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

标签在值的 ASN.1 数据定义中定义,在存在多种可能性(例如 CHOICE 值或可选值)的情况下识别值的种类很重要。

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

该值是传输值的编码。使用的编码根据值的类型而有所不同(例如,字符串使用与整数或对象标识符不同的编码)。通常,您需要 ASN.1 定义来理解值字节。在复合值的情况下,值部分中有零个或多个完整的值编码(每个都有标签长度值),例如 SEQUENCE 值的各个字段。

Google 搜索 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

【讨论】:

  • 谢谢@Henry,你能解释一下第一个例子和第二个例子有什么区别
  • 这只是一个不同的标签类,在第一种情况下,标签是 [UNIVERSAL 16],正如您所说的 SEQUENCE 或 SEQUENCE OF,在第二种情况下,它是 [PRIVATE 258]。您需要值的 ASN.1 定义才能知道私有标记值的含义。
  • 在第一个例子中 TAG : 30 in binary 00110000 - 位 8 和 7 的意思 --> Universal - 位 6 的意思 --> Constructed - 位 5..1 的意思 --> SEQUENCE或长度序列:二进制中的 82 = 10000010 和十进制 = 130 所以 130-128 = 2 所以十进制中的 02 10 = 528 所以值 = 下一个 528 字节。对吗?
  • 但是在第二个示例中存在差异,长度为(05)但长度必须为(02),而在第一个示例中,长度为(02 10),为什么?
  • 第二个例子的编码是tag df 82 02 意思是PRIVATE,primitive,long form,tag value 2*128 + 2 = 258;长度 = 5,值 = 12 34 56 78 90
猜你喜欢
  • 2012-04-11
  • 2010-11-19
  • 1970-01-01
  • 2012-06-14
  • 2019-06-09
  • 1970-01-01
  • 2014-12-27
  • 2022-01-22
  • 2023-03-19
相关资源
最近更新 更多