Выход HexDecoder пустой

У меня небольшая проблема с cryptopp562 (в Debian, если это имеет значение). У меня есть шестнадцатеричная строка, и я пытаюсь преобразовать ее в десятичное целое число. Я использую HexDecoder в cryptopp (поскольку я уже использую cryptopp для других вещей в проекте). Поскольку я не знаю способа перейти прямо от шестнадцатеричной строки к десятичному целому за один шаг, у меня есть промежуточный шаг десятичной строки. Такие вот дела

Шестнадцатеричная строка > Десятичная строка > Десятичное целое

Однако мой конвейер кажется неправильным, но я не могу понять, почему. Я даже не могу правильно преобразовать шестнадцатеричную строку в десятичную строку, поэтому мой десятичный int просто постоянно читает 0. Я использовал Base64Encoder (и Decoder) и ZlibCompressor (и Decompressor) в прошлом без проблем, так что это вроде немного неловко, потому что это должно быть просто больше того же самого.

std::string RecoveredDecimalString;
std::string RecoveredHex = "39"; //Hex, so would be 63 in decimal
CryptoPP::StringSource (RecoveredHex, true /*PumpAll*/,
    new CryptoPP::HexDecoder(
        new CryptoPP::StringSink(RecoveredDecimalString) /*StringSink*/
    )/*HexDecoder*/
);/*StringSource*/

Но, как я уже сказал, после запуска RecoveredDecimalString.empty() возвращает true. Сначала я подумал, что это из-за того, что я пропустил все параметры насоса, но добавление этого ничего не изменило, все равно ничего не течет.

Похожий вопрос был задан (и на него дан ответ) год назад. Ответ пришел как «читать вики cryptoPP», но я не вижу, чем мой код отличается от того, что есть в их вики.

Что я забыл? Я знаю, что это будет что-то очень маленькое.


person Mumbles    schedule 15.08.2014    source источник
comment
Ничего не зная о CryptoC++, он создает только (временный) объект CryptoPP::StringSource. Разве вам не нужно выполнить какое-то действие (например, вызвать какую-либо функцию-член), чтобы действительно выполнить преобразование?   -  person Some programmer dude    schedule 15.08.2014
comment
Мне не нужно было делать это с другими частями CryptoPP, но я все равно решил попробовать ваше предложение, но CryptoPP::StringSource HexSource(RecoveredHex, true /*PumpAll*/, new CryptoPP::HexDecoder(new CryptoPP::StringSink(RecoveredDecimalString)));, к сожалению, по-прежнему выдавал пустой вывод.   -  person Mumbles    schedule 15.08.2014
comment
читать вики по криптоПП — я этого не говорил; и я предоставил рабочий пример из вики (я также написал пример из вики).   -  person jww    schedule 19.08.2014


Ответы (1)


std::string RecoveredDecimalString;
std::string RecoveredHex = "39"; //Hex, so would be 63 in decimal
CryptoPP::StringSource (RecoveredHex, true /*PumpAll*/,
    new CryptoPP::HexDecoder(
        new CryptoPP::StringSink(RecoveredDecimalString) /*StringSink*/
    )/*HexDecoder*/
);/*StringSource*/

Назовите свой StringSource. В обновлении вашего кода обратите внимание, что StringSource был назван ss.

std::string decoded;
std::string encoded = "39"; //Hex, so would be 63 in decimal
CryptoPP::StringSource ss(encoded, true /*PumpAll*/,
    new CryptoPP::HexDecoder(
        new CryptoPP::StringSink(decoded) /*StringSink*/
    )/*HexDecoder*/
);/*StringSource*/

Некоторые версии GCC имеют проблемы с анонимными объявлениями. Некоторое время назад я обнаружил, что StringSink деструкторы запускаются слишком рано (до того, как данные были загружены). Я хотел подать отчет об ошибке GCC, но мне никогда не удавалось свести его к минимальному случаю.

Вы также можете выполнить:

std::string decoded;
std::string encoded = "39"; //Hex, so would be 63 in decimal

CryptoPP::HexDecoder decoder(new CryptoPP::StringSink(decoded));
decoder.Put(encoded.data(), encoded.size());
decoder.MessageEnd();
person jww    schedule 19.08.2014
comment
Интересно, что это, кажется, исправило это. Я не знал, что в какой-то версии GCC была эта проблема, но, если подумать, последний раз, когда я делал это, это было в Windows (VS 2008). Это мой первый раз, когда я использую анонимное объявление после перехода на Debian несколько лет назад, так что я должен это принять к сведению. Спасибо! - person Mumbles; 19.08.2014