我有一些二进制ASN.1数据对象需要解析到我的Java项目中。我只需要像BER Viewer一样解析的ASN.1结构和数据:
BouncyCastle的ASN.1解析器无法解析此结构(仅返回应用程序特定的二进制数据类型)。
我可以使用哪个ASN.1库来获得这样的结果?是否有人有演示如何解析ASN.1对象的示例代码?
顺便说一句:我还尝试了几个免费的ASN.1 Java编译器,但是没有一个能够生成给定ASN.1规范的工作Java代码。
我有一些二进制ASN.1数据对象需要解析到我的Java项目中。我只需要像BER Viewer一样解析的ASN.1结构和数据:
BouncyCastle的ASN.1解析器无法解析此结构(仅返回应用程序特定的二进制数据类型)。
我可以使用哪个ASN.1库来获得这样的结果?是否有人有演示如何解析ASN.1对象的示例代码?
顺便说一句:我还尝试了几个免费的ASN.1 Java编译器,但是没有一个能够生成给定ASN.1规范的工作Java代码。
我需要更正 - 使用BouncyCastle中包含的ASN.1解析器是可以读取数据的,然而这个过程并不简单。
如果你只想打印出包含在ASN.1结构中的数据,我建议你使用类org.bouncycastle.asn1.util.ASN1Dump。它可以通过以下简单的代码片段使用:
ASN1InputStream bIn = new ASN1InputStream(new ByteArrayInputStream(data));
ASN1Primitive obj = bIn.readObject();
System.out.println(ASN1Dump.dumpAsString(obj));
它打印结构但不打印数据 - 但是通过将ASN1Dump复制到自己的类中并修改以打印例如OCTET_STRINGS,这可以轻松完成。
此外,ASN1Dump中的代码演示了解析ASN.1结构的方法。例如,可以使用以下代码将用于我的问题的数据解析一级更深:
DERApplicationSpecific app = (DERApplicationSpecific) obj;
ASN1Sequence seq = (ASN1Sequence) app.getObject(BERTags.SEQUENCE);
Enumeration secEnum = seq.getObjects();
while (secEnum.hasMoreElements()) {
ASN1Primitive seqObj = (ASN1Primitive) secEnum.nextElement();
System.out.println(seqObj);
}
ASN1InputStream ais = new ASN1InputStream(
new FileInputStream(new File("d:/myfile.cdr")));
while (ais.available() > 0) {
ASN1Primitive obj = ais.readObject();
System.out.println(ASN1Dump.dumpAsString(obj, true));
}
ais.close();
如果你只是想解码BER编码的数据,那么有很多解析器可供选择。你试过吗?甚至在Sun JDK中有两个 - com.sun.jmx.snmp.BerDecoder 和 com.sun.jndi.ldap.BerDecoder。