【发布时间】:2018-04-23 05:41:55
【问题描述】:
我正在尝试从 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
这些元素对应的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 Unmarshalling using go structs gives tags don't match error) 中,我被告知我应该对这些结构使用隐式 asn.1 标记。但是,这些标签不适用于这些特定于应用程序的元素。
仅供参考,当仅将上述十六进制流的3080a080800106830200e20000a28080010181010d00008301650000(消息部分)输入http://asn1-playground.oss.com/时,解码成功。然而,在 go 代码中使用相同的流时给出:
找到不定长度(不是 DER)
在这些 go 结构中应该使用哪些 asn.1 标签才能成功解组?
【问题讨论】:
-
模块定义格式如下: Module-Name DEFINITIONS AUTOMATIC TAGS := etc...
-
有这个实现BER编码/解码的库。它基于“encoding/asn1”包:github.com/Logicalis/asn1。这对我有帮助。