我有以下ASN1数据
Sequence
Sequence
ObjectIdentifier
Sequence
Sequence
Integer
Integer
Sequence
Integer
Integer
我的目标是获取编码的整数值。到目前为止我的代码是以下
ByteQueue queue(inputLen);
queue.Put2(input, inputLen, 0, false);
BERSequenceDecoder outer(queue);
BERSequenceDecoder discard(outer); // unnecessary sequence with object_identifier
BERSequenceDecoder obj(discard,
CryptoPP::ASNTag::OBJECT_IDENTIFIER | CryptoPP::ASNIdFlag::UNIVERSAL);
BERSequenceDecoder parent(outer); //BER decode error
for(int i = 0; i < 2; i++) {
BERSequenceDecoder dataSequence(parent);
Integer i1, i2;
i1.BERDecode(dataSequence);
i2.BERDecode(dataSequence);
问题是,我不知道如何正确地通过object_identifier部分,至少我认为这是问题所在。我在4.解码器对象上得到BER decode error
。
另外,我是否正确初始化了ByteQueue?这个Put2
方法似乎不是正确的方法,但我没有找到任何其他方法。
答案 0 :(得分:1)
ByteQueue queue(inputLen); queue.Put2(input, inputLen, 0, false);
您还可以执行以下操作:
ArraySource as(input, inputLen, false /*pumpAll*/);
as.TransferTo(queue);
或者,如果您只想复制它们:
as.CopyTo(queue);
问题是,我不知道如何正确地通过object_identifier部分......
我可能会这样做:
byte b = as.Peek();
if(b == /*some tag*/)
as.Skip(n);
或者:
byte b = as.Peek();
if(b == /*some tag*/)
{
lword length;
bool definiteLength;
if(!BERLengthDecode(as, length, definiteLength))
throw BadParam();
as.Skip(length);
}
包含上述内容的源文件是asn.h
和asn.cpp
。您可能感兴趣的其他人包括BERDecodeOctetString
和BERDecodeBitString
。