【问题标题】:Parsing ASN1 data解析 ASN1 数据
【发布时间】:2016-01-13 10:00:54
【问题描述】:

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

  1. 将最后 7 个字节从 HEX 转换为二进制
  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 编码的数据必须是标签-长度-值格式还是可以使用某种特定的语法?

现在这是我的代码:

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 的示例:

【问题讨论】:

  • 您可以为示例数据添加示例 ASN1 语法定义吗?

标签: java parsing bouncycastle asn.1


【解决方案1】:

ASN1 编码数据是否必须是标签长度值格式或 可以使用某种特定的语法吗?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多