base64Decode: как получить данные

#c #crypto

#c #крипто

Вопрос:

Кажется, что это был бы простой вопрос, но crypto , похоже, разработан в стиле фанк, «как можно более тупым», так что мне интересно…

Как я могу получить двоичные данные из объекта CryptoPP::base64Decode? Предполагая, что я не хочу записывать это в файл или кодировать каким-либо другим способом, как мне просто получить фактические двоичные данные?

Редактировать: разобрался; не уверен, как закрыть / удалить это, кто-нибудь? Что мне следует сделать здесь сейчас?

Комментарии:

1. Можете ли вы рассказать нам более подробно о том, чего именно вы пытаетесь достичь?

Ответ №1:

Неважно, разобрался. Для справки, я хотел получить методы MaxRetrievable и Get подкласса BufferedTransformation.

Ответ №2:

Кажется, что это был бы простой вопрос, но crypto , похоже, разработан в стиле фанк, «как можно более тупым», так что мне интересно…

Это непростой вопрос, если вы не знакомы с дизайном Crypto . На самом деле работают два проекта.

Сначала выполняется классическое обновление / финал. Это реализовано в Crypto с помощью Put и Get и друзей.

Второй — это дизайн с использованием pipleline. Вот где данные перетекают из источника в приемник, и вы увидите это как, например:

 FileSource fs( "Hello World", true /*pumpAll*/
    new HexEncoder( e,
        new FileSink( "encoded.txt" )     
); // FileSource
  

Конвейер эквивалентен командам Unix:

 echo "Hello World" | base64 >> encoded.txt
  

Конвейер обобщается на:

 Source -> Filter -> Filter -> ... -> Filter -> Sink
  

Внутренне Source вызовет Put первый фильтр; первый фильтр преобразует данные и вызовет Put второй фильтр, и так далее. Последний фильтр будет вызван Put на Приемнике. Более правильно, будут вызываться источник и фильтры Put2 , но это детали реализации.

Если нет приемника:

 Source -> Filter -> NULL
  

затем фильтр будет внутренне буферизовать преобразованные данные. Для извлечения данных из фильтра или приемника можно использовать Get , GetWord16 GetWord32 , MaxRetrievable AnyRetrievable ,, и т.д.

Put , Get , MaxRetrievable и друзья являются частью BufferedTransformation интерфейса, и это интерфейс, который реализуют все фильтры и приемники (на самом деле нет необходимости в источнике для его реализации). Если класс не предоставляет Put , Get и друзей, то это не фильтр или приемник. Документация для класса находится по адресу BufferedTransformation Class Reference.

Это намного больше, включая блокировку и перекачку данных блоками, но на самом деле это не нужно для фильтра или объекта Base64. pumpAll В приведенном выше примере означает одновременную передачу всех данных.