Я новичок в работе с закодированными потоками ASN.1, и мне трудно найти бесплатный компилятор и декодер класса, желательно для Java.Opensource 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/ Он не говорит, поддерживает ли он автоматические метки или нет. Кажется, что компиляция Обозначения без жалобы, но я не могу заставить ее правильно декодировать, и похоже, что пометка неверна.
Если мы возьмем начало закодированной строки: 82 02 30 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, чтобы заставить его работать.