ASN.1使用go结构解组wireshark十六进制代码

ASN.1使用go结构解组wireshark十六进制代码,go,asn.1,asn1,Go,Asn.1,Asn1,我试图从tcp转储中解码以下十六进制代码。 18001c3080a080800106830200e20000a28080010181010d00008301650000 我试图解码的ASN.1定义的格式如下: ConnectionEstablishedReply ::= SEQUENCE { message MessageFields, nackReason NackReason OPTIONAL, interfaceVersion InterfaceVersi

我试图从tcp转储中解码以下十六进制代码。 18001c3080a080800106830200e20000a28080010181010d00008301650000

我试图解码的ASN.1定义的格式如下:

ConnectionEstablishedReply  ::= SEQUENCE {
message         MessageFields,
nackReason      NackReason OPTIONAL,
interfaceVersion    InterfaceVersion,
mediatorId      INTEGER (1..65535),
waitForCommit       BOOLEAN OPTIONAL,
...
}

MessageFields       ::= SEQUENCE {
messageSequence     INTEGER (1..65535),
bsId    INTEGER (1..65535) OPTIONAL,
neID        INTEGER(0..16777216) OPTIONAL, -- unsigned int
nelementID  INTEGER(0..16777216) OPTIONAL, -- unsigned int
...
}

InterfaceVersion        ::= SEQUENCE {
major           INTEGER (1..100),
minor           INTEGER (0..100)
}
据我所知,从tcp转储重新建立的ConnectionEstablishedReply的标记或类型是24,而序列的标记是16。这些标记中的不匹配是导致错误的原因:

解组时出错:asn1:结构错误:标记不匹配16 vs{class:0标记:24长度:0 isCompound:false}{可选:false显式:false应用程序:false defaultValue:标记:stringType:0时间类型:0集合:false省略空:false}ConnectionEstablishedReply@2

与这些元素对应的go结构是:

type ConnectionEstablishedReply struct {
    Message          MessageFields    
    NackReason       NackReason       `asn1:"optional"`
    InterfaceVersion InterfaceVersion 
    MediatorId       int              
    WaitForCommit    bool             `asn1:"optional"`
}
其他元素也是如此

解组代码:

res := structs.ConnectionEstablishedReply{}
data, _ := hex.DecodeString("18001c3080a080800106830200e20000a28080010181010d00008301650000")
_, err := asn1.Unmarshal(data, &res)
if err != nil {
    fmt.Println("Error while unmarshalling: ", err)
}
fmt.Println(res)
在前面的一个类似问题中,我被告知应该对这些结构使用隐式asn.1标记。但是,这些标记不适用于这些特定于应用程序的元素

仅供参考,当仅将上述十六进制流的3080a080800106830200e20000a28080010181010d00008301650000消息部分馈入时,解码成功。然而,在go代码中使用的相同流给出:

未发现不定长


在这些go结构中应该使用哪些asn.1标记,以便成功解组

标签没有问题。这是一个问题,你的库解码无限长的能力。 对于构造类型(如序列),您可以使用:

标记长度值也称为定长形式

标签'80'H值'0000'H也称为不定长形式

您收到的消息对所有序列使用无限长。 您的lib不支持它,因为它在不允许使用此表单的情况下坚持可分辨编码规则。 如果你的库支持它,你的消息部分将被解码如下

T: 30 (CONSTRUCTED_UNIVERSAL_16) 
L: 80 (indefinite)   
   T: a0 (CONSTRUCTED_CONTEXT_0)
   L: 80 (indefinite)
     T: 80 (PRIMITIVE_CONTEXT_0)
     L: 1
     V: 06
     T: 83 (PRIMITIVE_CONTEXT_3)
     L: 2
     V: 00 e2
   0000: end of content

   T: a2 (CONSTRUCTED_CONTEXT_2)   
   L: 80 (indefinite)
      T: 80 (PRIMITIVE_CONTEXT_0)
      L: 1
      V: 01
      T: 81 (PRIMITIVE_CONTEXT_1)
      L: 1
      V: 0d
   0000: end of content 

   T: 83 (PRIMITIVE_CONTEXT_3)   
   L: 1   
   V: 65 
0000: end of content

模块定义的格式如下:模块名称定义自动标记:=等。有一个实现BER编码/解码的库。它基于编码/asn1包:。这对我有帮助。