【发布时间】:2016-08-26 23:01:57
【问题描述】:
我想用 c++ 解码一个大文件的字符串。
链的大小为:1827500个字符 文件为:1370626字节
我的问题是解码功能不起作用。 解码后的文件与原文件不同。
以下是我尝试过的两种方法
第一:
char *base64_decode(const std::string &input, long *size)
{
BIO *p_bio_mem = nullptr;
BIO *p_bio_b64 = nullptr;
char *retrnvalue;
p_bio_b64 = BIO_new(BIO_f_base64());
if (!p_bio_b64) { throw std::runtime_error("BIO_new failed"); }
BIO_set_flags(p_bio_b64, BIO_FLAGS_BASE64_NO_NL); //Don't require trailing newlines
p_bio_mem = BIO_new_mem_buf((void*)input.c_str(), input.length());
if (!p_bio_mem) { throw std::runtime_error("BIO_new failed"); }
BIO_push(p_bio_b64, p_bio_mem);
// read result from chain
// read sequence (reverse to write): buf <<-- p_bio_b64 <<-- p_bio_mem
std::vector<char> buf((input.size() * 3 / 4) + 1);
std::string result;
for (;;)
{
auto nread = BIO_read(p_bio_b64, buf.data(), buf.size());
if (nread < 0) { return NULL; //fail}
if (nread == 0) { break; } // eof
result.append(buf.data(), nread);
}
BIO_free_all(p_bio_b64);
*size = buf.size();
retrnvalue = new char[*size];
memcpy(retrnvalue, buf.data(), *size);
return retrnvalue;
}
第二:
来自这里的代码:How do I base64 encode (decode) in C?
有些行尾不同:
但不是整个文件:
你能告诉我为什么吗?和/或告诉我另一种编码文件以便于传输的方法?
我有这个输入:drive.google.com/file/d/0B1i4Ez8N86wFblJnaFF6YVNVTWs/view
我希望输出:drive.google.com/file/d/0B1i4Ez8N86wFdl9OUE5UMFB3R28/view
(对不起,我不能放超过 2 个链接)
PS:当我使用“certutil -decode”批量解码时,它可以正常工作。
已解决:问题已解决,问题是 fwrite 。使用 ofstream 写入功能修复
【问题讨论】:
-
相关,请参阅 OpenSSL wiki 上的 EVP Encryption | C++ Programs。它向您展示了如何使用智能指针来管理资源。另见How to get PKCS7_sign result into a char * or std::string。它为 OpenSSL 数据类型提供了一堆智能指针。
-
在桌面上将 1827500 读入内存是可以的,但它会破坏 Android 或 iOS 设备。您可能需要切换到流式加密和解密(可能还有编码和解码)。
-
感谢您的 EVP 加密。此项目不适用于其他设备,谢谢
标签: c++ openssl base64 decode end-of-line