ASN.1でエンコードされたストリームを扱うのが初めてで、Java用の無料クラスコンパイラとデコーダを見つけるのは難しいです。Opensource自動タグで動作するJava ASN.1デコーダ
私はエンコードされた16進文字列があります。ここでは
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/ 自動タグをサポートしているかどうかはわかりません。それは、不平を言って表記をコンパイルするようですが、私はそれを正しく解読することができませんし、間違っていればタグ付けのように見えます。
我々はエンコードされた文字列の先頭取る場合: ... 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によって無視されている。私たちはSemiDialogIDユニバーサルCLAS識別子を使用していますBerEnumを、拡張参照生成されたJavaクラスを見てみると:
// 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を使って動作させることができたと思います。