base64使用openssl BIO逐块解码

时间:2017-04-21 10:35:41

标签: c++ encoding openssl base64

我在使用以下代码解码base64编码数据时遇到问题。我有大约3.5 MB的数据要解码。它工作得很好,直到最后缺少某些东西。

以下代码读取100 kB源数据块,将其写入BIO_s_mem,然后多次读取1024字节的解码数据。当没有其他内容可读时,将检索另一个100 kB的块并再次使用。它一直很好,直到收到最后一个块。它没有完整的100 kB(仅25685字节)。我把它写到BIO,得到18次解码1024字节,然后另外435和它。但并非全部。仍然缺少大约100个字节的解码数据。

正确接收所有编码数据(将它们保存到文件并从shell命令手动解码得到完整输出)。我该如何从BIO那里得到剩下的?我想我应该以某种方式说它就是全部。我尝试了多种方式BIO_flush,一些标志,为编码数据添加换行,但还没有成功。

BIO *bmem, *b64;
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new(BIO_s_mem());
BIO_push(b64, bmem);
vector<char> buf(1024);

while (!end) {
    end = task->nextChunk(chunk, chunkSize); // this reads encoded data block
    BIO_write(bmem, (void*)chunk, chunkSize);
    cout << "Chunk size: " << chunkSize << endl;
    if (end || chunkSize == 0) {
        BIO_flush(bmem); // I tried multiple things
        BIO_flush(b64); // flush here and there, nothing helped
        BIO_set_close(bmem, BIO_CLOSE); // and other things... ;-)
    }

    string result;
    int nread;
    while ((nread = BIO_read(b64, buf.data(), buf.size())) > 0) {
        cout << "Decoded bytes read: " << nread << endl;
        result.append(buf.data(), nread);
    }
    ret->appendRaw(result.c_str(), result.size()); // store result somehow
}

最后输出序列:

Chunk size: 25685
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 1024
Decoded bytes read: 435
Chunk size: 0

再一次:解码输出是二进制文件。它被正确编码,正确发送到我的代码,但没有解码,最后丢失大约100个字节。 谢谢你的任何提示。

1 个答案:

答案 0 :(得分:0)

诀窍是在最终的BIO_read序列之前添加以下两行:

        BIO_write(bmem, "\n", 1);
        BIO_set_mem_eof_return(bmem, BIO_NOCLOSE);