Кодирование Base64 с использованием исключения броска ускорения

Я пытаюсь использовать Boost Base64 кодировщик, я нашел пример, но я получил и исключение

typedef 
transform_width< binary_from_base64<std::string::const_iterator>, 8, 6 > it_binary_t

я использовал

std::string b64E(it_binary_t(Encrip.begin()), it_binary_t(Encrip.end()));

Я понял

Необработанное исключение в 0x75b1b9bc в agentid_coder.exe: исключение Microsoft C++: boost::archive::iterators::dataflow_exception в расположении памяти 0x0046ed94..

Я нашел этот обходной путь, но я получил тот же результат

 string dec( 
        it_binary_t(Encrip.begin()), 
        it_binary_t(Encrip.begin() + Encrip.length() - 1) 
        ); 

Я использую MSVS2008 и повысить 1,38

1 ответ

Решение

К сожалению, сочетание двух iterator_adaptorsbinary_from_base64 а также transform_width не полный кодировщик / декодер base64. Base64 представляет группы из 24 бит (3 байта) в виде 4 символов, каждый из которых кодирует 6 бит. Если входные данные не кратны целым 3-байтовым группам, их необходимо заполнить одним или двумя нулевыми байтами. Чтобы указать, сколько байтов заполнения было добавлено, один или два = символы добавляются к закодированной строке.

transform_width, который отвечает за преобразование 8-битного двоичного в 6-битное целое, не применяет это заполнение автоматически, это должно быть сделано пользователем. Простой пример:

#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <boost/archive/iterators/insert_linebreaks.hpp>
#include <boost/archive/iterators/remove_whitespace.hpp>
#include <iostream>
#include <string>

using namespace boost::archive::iterators;
using namespace std;

int main(int argc, char **argv) {
  typedef transform_width< binary_from_base64<remove_whitespace<string::const_iterator> >, 8, 6 > it_binary_t;
  typedef insert_linebreaks<base64_from_binary<transform_width<string::const_iterator,6,8> >, 72 > it_base64_t;
  string s;
  getline(cin, s, '\n');
  cout << "Your string is: '"<<s<<"'"<<endl;

  // Encode
  unsigned int writePaddChars = (3-s.length()%3)%3;
  string base64(it_base64_t(s.begin()),it_base64_t(s.end()));
  base64.append(writePaddChars,'=');

  cout << "Base64 representation: " << base64 << endl;

  // Decode
  unsigned int paddChars = count(base64.begin(), base64.end(), '=');
  std::replace(base64.begin(),base64.end(),'=','A'); // replace '=' by base64 encoding of '\0'
  string result(it_binary_t(base64.begin()), it_binary_t(base64.end())); // decode
  result.erase(result.end()-paddChars,result.end());  // erase padding '\0' characters
  cout << "Decoded: " << result << endl;
  return 0;
}

Обратите внимание, что я добавил insert_linebreaks а также remove_whitespace итераторы, чтобы вывод base64 был хорошо отформатирован, а ввод base64 с разрывами строк можно было декодировать. Это необязательно, хотя.

Запускать с разными входными строками, которые требуют различного заполнения:

$ ./base64example
Hello World!
Your string is: 'Hello World!'
Base64 representation: SGVsbG8gV29ybGQh
Decoded: Hello World!
$ ./base64example
Hello World!!
Your string is: 'Hello World!!'
Base64 representation: SGVsbG8gV29ybGQhIQ==
Decoded: Hello World!!
$ ./base64example
Hello World!!!
Your string is: 'Hello World!!!'
Base64 representation: SGVsbG8gV29ybGQhISE=
Decoded: Hello World!!!

Вы можете проверить строки base64 с этим онлайн-кодером / декодером.

Другие вопросы по тегам