Java 解析ASN1编码的整数

Java 解析ASN1编码的整数,java,bouncycastle,Java,Bouncycastle,我有这样的数据序列 ASN1InputStream asn1InputStream = new SN1InputStream(attestationExtensionBytes); DEROctetString octString=(DEROctetString) asn1InputStream.readObject(); byte[] octectBytes=octString.getOctets(); asn1InputStream =new ASN1InputStream (octectB

我有这样的数据序列

ASN1InputStream asn1InputStream = new SN1InputStream(attestationExtensionBytes);
DEROctetString octString=(DEROctetString) asn1InputStream.readObject();
byte[] octectBytes=octString.getOctets();
asn1InputStream =new ASN1InputStream (octectBytes);
ASN1Integer asn1Integer=(ASN1Integer)asn1InputStream.readObject();
序列(2个元素)

对象标识符1.3.6.1.4.1.41482.3.7

八位字符串(1个元素)

整数7029542

我可以得到八进制字符串,十六进制是02036b4326 02我认为是整数标记,03是长度,6b4326是整数的十六进制值
尝试查找是否有内置的BouncyCastle库,在那里我可以传递十六进制值或DerOctString,并能够返回整数值

我想我找到了答案,看起来您必须创建一个新的ASN1InputStream,并将八进制字符串的值传递给它,然后作为ASN1Integer读回

像这样的

ASN1InputStream asn1InputStream = new SN1InputStream(attestationExtensionBytes);
DEROctetString octString=(DEROctetString) asn1InputStream.readObject();
byte[] octectBytes=octString.getOctets();
asn1InputStream =new ASN1InputStream (octectBytes);
ASN1Integer asn1Integer=(ASN1Integer)asn1InputStream.readObject();

你的结构看起来有点不清楚。如果我理解正确,八进制字符串包含整数的DER编码。只需分两步进行解码,第一步是外部值,第二步是八位字节字符串的字节。在BC的最新版本中,可以使用ASN1Integer.getInstance(octString.getOctets())。它比上面的代码好,因为它还检查整数后面的八位字节字符串中是否没有“额外”数据。