2015-07-27 4 views
1

я следующие данные ASN1ASN1 OBJECT_IDENTIFIER декодирования

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 части, по крайней мере, я думаю, что это проблема. Я получаю BER decode error на объекте 4. декодера.

Также, правильно ли я инициализирую ByteQueue? этот метод Put2 не кажется правильным, но я не нашел других методов.

+0

Возможно, вы также захотите проверить [Как декодировать неинтерпретированные данные ASN1?] (Http://stackoverflow.com/q/29652055) – jww

ответ

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.

+0

Это было очень полезно, поскольку 'Peek()' делает отладку очень просто. Проблема заключается в том, что, по-видимому, для метода ArraySource или ByteQueue не существует метода 'Discard()'. Как пропустить байты? – Kelo

+0

@ Kelo - Мой плохой ... Его называют 'Skip'. См. [Справочник класса BufferedTransformation] (http://www.cryptopp.com/docs/ref/class_buffered_transformation.html). Источники, фильтры и Sinks все наследуют от него ('ArraySource' и' ByteQueue' являются примерами источников. ByteQueue тоже может быть раковиной). – jww