【发布时间】:2016-08-31 14:13:53
【问题描述】:
我是使用 ASN.1 编码流的新手,我很难找到免费的类编译器和解码器,最好是用于 Java。
我有一个编码的十六进制字符串:
String test("30820274800200a2810105820410300c3d830401bb0afc84...
这是一个表示法的例子:
SEMI DEFINITIONS AUTOMATIC TAGS ::= BEGIN
IntersectionSituationData ::= SEQUENCE {
dialogID SemiDialogID, -- 0xA2
seqID SemiSequenceID, -- 0x05 Data
groupID GroupID,
-- Some more members
}
SemiDialogID ::= ENUMERATED {
intersectionSitDataDep (162), -- 0xA2
-- additional DialogIDs
}
SemiSequenceID ::= ENUMERATED {
data (5), -- Data
-- additional SeqIDs
}
我开始使用江淮汽车:https://sourceforge.net/projects/jac-asn1/ 但它不支持自动标签。
我接下来尝试了 jASN1:https://www.openmuc.org/asn1/ 它没有说它是否支持自动标签。它似乎可以毫无怨言地编译 Notation,但我无法正确解码,如果错误,它看起来像标记。
如果我们取编码字符串的开头:30 82 02 74 80 02 00 a2... 这是我的理解:
30 = Sequence
82 = Length encoded in 2 octets
02 74 = Length = 2x256 + 7x16 +4 == 638 bytes, correct
80 ?? is this a result of automatic encoding? x80= 128= 8th bit set = context-specific class, number 0?
02 = length of value is 2 octets
00 a2 is value == xA2 as expected from SemiDialogID
但是,如果我对“IntersectionSituationData”的测试进行编码,我会得到以下信息:30 81 8a 0a 02 00 a2 即类型是 'x0a' == 10,即 ASN.1 Universal ENUMERATED。从他的通知来看这是有道理的,但我猜自动标签被 jASN1 忽略了。当我查看生成的 Java 类时,我们看到 SemiDialogID 扩展了 BerEnum,它使用通用类标识符:
// SemiDialogID.java
public class SemiDialogID extends BerEnum {
...
}
//BerEnum.java
public class BerEnum extends BerInteger {
public final static BerIdentifier identifier = new BerIdentifier(BerIdentifier.UNIVERSAL_CLASS,
BerIdentifier.PRIMITIVE, BerIdentifier.ENUMERATED_TAG);
我需要做些什么来让 jASN1 使用自动标签,还是我需要一个不同的库?如果是后者,人们会推荐什么?理想情况下,我正在寻找一个易于使用的开源 Java 解决方案。我想我可以使用 C 解决方案并使用 JNI 让它工作。
【问题讨论】:
-
jASN1 现已移至beanit.com/asn1
标签: java tags asn.1 decoder ber