读BERTLV时,什么时候停下来?

cod*_*ero 3 asn.1 tlv ber

我有以下 BERTLV: 61394F0BA00000030800001001234579074F05A000012345500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D7F66080202800002028000

我试图以递归方式解析它,所以我将第一部分视为 TLV。

标签: 0x61, Len: 0x39, 值:4F0BA00000030800001001234579074F05A000012345500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D

然后我进一步分解它,得到

标签: 0x4F, Len: 0x0B, 值: A000000308000010012345

现在,我该如何停止?在这一点上,我知道这个值是这个 TLV 的最后一站,而不是另一个嵌套的 TLV。

cod*_*ero 5

好吧,经过大量挖掘,我发现简单TAG实际上不仅仅是一个数字,它TAG本身实际上在那里编码了早午餐信息。我为了找出TLV包含是否嵌套,TLV以便我的代码知道何时继续处理以及何时停止,我必须解码TAG.

所以TAG包含8位,每一位都有特殊的含义:

TLV TAG 及其比特含义

我需要的是一点B5,以确定当前是否TLVConstructed或不...当Constructed它意味着目前TLV由多个的TLV,所以我的代码,我使用这个信息在嵌套递归挖掘TLV

TLV不是 Constructed就是我停止的情况下,以泡沫备份。

这是我通过解析数据并检查位B5来输出的递归函数TAG

11:20:38.428 Parsing: 61394F0BA00000030800001000010079074F05A000000308500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D7F66080202800002028000
11:20:38.436 Constructed Data Object
11:20:38.437 Parsing: 4F0BA00000030800001000010079074F05A000000308500E49442D4F6E65205049562042494F5F50107777772E6F626572746875722E636F6D
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 79, len: 11, value: A000000308000010000100
11:20:38.437 Constructed Data Object
11:20:38.437 Parsing: 4F05A000000308
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 79, len: 5, value: A000000308
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 80, len: 14, value: 49442D4F6E65205049562042494F
11:20:38.437 MultiByte tag
11:20:38.437 Primitive Data Object
11:20:38.437 tag: 24400, len: 16, value: 7777772E6F626572746875722E636F6D
11:20:38.438 MultiByte tag
11:20:38.438 Constructed Data Object
11:20:38.438 Parsing: 0202800002028000
11:20:38.438 Primitive Data Object
11:20:38.438 tag: 2, len: 2, value: 8000
11:20:38.438 Primitive Data Object
11:20:38.438 tag: 2, len: 2, value: 8000
Run Code Online (Sandbox Code Playgroud)