解析 ASN1 数据

Parsing ASN1 data

我应该将 ASN1 编码字节数组解析为 Java 对象。我的公司给了我一份结构非常详细的文档。然而在他们解析数据的例子中(没有代码,只是从位到值的映射):

  1. 将最后 7 个字节从十六进制转换为二进制
  2. 根据这 7 个字节中的特定位赋值

没有考虑标签和长度。该示例还只是跳过了后续字节。我不确定如何使用 Bouncy Castle ASN1 库.

解析这样的数据

这是数据:

Example data

这是映射:

22 0....... some field = 0
   .01000.. some field = 8
   ......1. some field = 1
   .......0 some field = 0

ASN1 编码数据是否必须采用 Tag-Length-Value 格式,还是可以使用某种特定语法?

现在这是我的代码:

ASN1InputStream asn1InputStream = new ASN1InputStream(
            new ByteArrayInputStream(
                ByteArrayUtil.hexStringToByteArray(
                    "16" + "07" +
                    "22" + "00" + "00" + "19" + "BF" + "12" + "E0")));
        ASN1Primitive deria5String;
        while ((deria5String = asn1InputStream.readObject()) != null) {
            //process
        }

解析最后 7 个字节得到 DERIA5String 类型的对象。

编辑 1: 下面是我应该阅读 InputStream 的 ASN1 结构的定义:

这是我在文档中读取 InputStream 的示例:

Does the ASN1 encoded data have to be in Tag-Length-Value format or can it be using some kind of specific grammar?

BER 和DER 编码数据使用TLV 格式。然而,这并不意味着您的应用程序没有赋予某些八位字节串、整数、字符串等特殊含义,ASN.1 中没有表示这些含义。如果我冒险猜测,因为“16 07”对应于标签 [UNIVERSAL 22] 和长度 7,其中该特定标签表示字符串,我猜他们正在从字符串中解析一些数据。