我正在尝试从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 tag:24 length:0 isCompound:false}){optional:false explicit:false application:false defaultValue:tag:stringType :0 timeType:0 set:false omitEmpty:false} ConnectionEstablishedReply @ 2
与这些元素相对应的结构是:
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 Unmarshalling using go structs gives tags don't match error)中,我被告知我应该使用带有这些结构的隐式asn.1标记。但是,这些标记不适用于这些特定于应用程序的元素。
FYI,当仅将上述十六进制流的3080a080800106830200e20000a28080010181010d00008301650000(消息部分)馈送到http://asn1-playground.oss.com/时,解码成功。然而,在go代码中使用相同的流时会给出:
找到无限长度(不是DER)
在这些结构中应该使用哪些asn.1标签,以便解组成功?
答案 0 :(得分:1)
标签没有问题。你的lib解码无限长度的能力是个问题。 对于构造类型(例如序列),您可以使用:
标签长度值(也称为确定长度形式)
或
标记' H' H值&00; 0000' H(也称为无限长格式)
您收到的消息对所有序列使用无限长度。 您的lib不支持它,因为它坚持使用不允许此表单的可分辨编码规则(DER)。 如果你的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