Я использую объекты openssl BIO для преобразования двоичной строки в строку base64. Код выглядит следующим образом:
void ToBase64(std::string & s_in) {
BIO * b_s = BIO_new( BIO_s_mem() );
BIO * b64_f = BIO_new( BIO_f_base64() );
b_s = BIO_push( b64_f , b_s);
std::cout << "IN::" << s_in.length();
BIO_write(b_s, s_in.c_str(), s_in.length());
char * pp;
int sz = BIO_get_mem_data(b_s, &pp);
std::cout << "OUT::" << sz << endl;
s_in.assign(pp,sz);
//std::cout << sz << " " << std::string(pp,sz) << std::endl;
BIO_free (b64_f); // TODO ret error potential
BIO_free (b_s); //
}
Длина составляет 64 или 72. Однако выход всегда равен 65, что неверно, оно должно быть намного больше, чем это. Документация не самая лучшая в мире, AFAIK объект bio_s_mem должен динамически расти. Что я делаю неправильно ?
Возможно, мне лучше найти автономный класс C ++, который не предлагает потоковую поддержку и поддерживает преобразования base64. Поддержка потоковой передачи не подходит для моего приложения. Однако я просто хотел придерживаться openSSL, так как я уже зависел от некоторых крипто-подпрограмм. Во всяком случае, я приму такое решение после профилирования.