我有一个字节数组,形式为asn1格式。现在我想解析此数据以获取所需的信息。这是他们为c ++编写的代码。现在我要在java.could中进行相同的操作对此有任何帮助。

ASN1 asn1(in);

 int startPos = in.tellg();
 asn1.enterObject(asn1.getTag());
 int endPos = asn1.getCurrentLength() + in.tellg();

 ubytearray acctId, valData;

 while (in.tellg() < endPos) {
     asn1.enterObject(0x30); //0x30 TAG_SEQ

     // read the name
     ubytearray nameData = asn1.getContent(ASN1_TAG_UTF8_STRING);
     ubytearray octstr =  asn1.getContent(ASN1_TAG_OCTET_STRING);

ASN1 asn2(octstr);
asn2.enterObject(0x30);
ustring urlstr(asn2.getContent(ASN1_TAG_UTF8_STRING));
ustring nameStr(asn2.getContent(ASN1_TAG_UTF8_STRING));
asn2.enterObject(0x30);
ubytearray certs = asn2.getContent(ASN1_TAG_OCTET_STRING);
     if ((urlstr.length() > 0)  && (nameStr.length() > 0) && (certs.length() > 0)) {
         printf("url %s\n", urlstr.c_str());
         printf("name %s\n", nameStr.c_str());
         printf("certs len:%d\n", certs.length());

}
}

最佳答案

您应该能够使用org.bouncycastle.asn1中的类(从ASN1InputStream开始)从InputStream或byte []中读取ASN.1结构。遵循示例代码有些困难,但是类似这样的方法可能会帮助您入门:

    byte[] data = null; // obviously need to supply real data here
    ASN1InputStream input = new ASN1InputStream(data);

    ASN1Primitive p;
    while ((p = input.readObject()) != null) {
        ASN1Sequence asn1 = ASN1Sequence.getInstance(p);

        DERUTF8String nameData = DERUTF8String.getInstance(asn1.getObjectAt(0));
        ASN1OctetString octstr = ASN1OctetString.getInstance(asn1.getObjectAt(1));

        ASN1Sequence asn2 = ASN1Sequence.getInstance(ASN1Primitive.fromByteArray(octstr.getOctets()));

        // ... and so on
    }

如果您发现难以理解的数据结构,那么org.bouncycastle.asn1.util.ASN1Dump类可能会有所帮助:
    byte[] data = null; // obviously need to supply real data here
    ASN1InputStream input = new ASN1InputStream(data);

    ASN1Primitive p;
    while ((p = input.readObject()) != null) {
        System.out.println(ASN1Dump.dumpAsString(p));
    }

09-28 02:45