我是新來的ASN.1編碼流,我很難找到一個免費的類編譯器和解碼器,最好是Java。與自動標籤一起工作的開源Java ASN.1解碼器
我有一個編碼的十六進制字符串:
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
}
我開始使用JAC: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,它採用通用CLAS標識符:
// 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來實現它。