base64 解码 C++ 失败行尾字节
base64 decode c++ fail end of line byte
我想用 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 写入函数修复
您读取 base64 数据的代码非常混乱:
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;
您将数据读取到一个名为 result
的字符串中,但您从未对其进行任何操作。然后将暂存缓冲区的内容复制到输出缓冲区中。你也可以取消你的 size
指针,只是 return 一个 std::string
而不是原始的 char*
.
另一个可能的问题是线路
BIO_set_flags(p_bio_b64, BIO_FLAGS_BASE64_NO_NL); //Don't require trailing newlines
如果您的输入确实包含换行符,那么该行将导致问题。如果你想使用可能包含或不包含换行符的输入,你需要使该行有条件:
if (input.find('\n') == std::string::npos) {
BIO_set_flags(p_bio_b64, BIO_FLAGS_BASE64_NO_NL); //Don't require trailing newlines
}
加在一起,看起来像这样:
std::string base64_decode(const std::string &input)
{
BIO *p_bio_mem = nullptr;
BIO *p_bio_b64 = nullptr;
p_bio_b64 = BIO_new(BIO_f_base64());
if (!p_bio_b64) { throw std::runtime_error("BIO_new failed"); }
if (input.find('\n') == std::string::npos) {
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);
std::stringstream result;
std::vector<char> buf(1024);
while (auto nread = BIO_read(p_bio_b64, buf.data(), buf.size()))
{
if (nread < 0) { throw std::runtime_error("OMGZ"); } //fail
result.write(buf.data(), nread);
}
BIO_free_all(p_bio_b64);
return result.str();
}
你可能还想添加一些错误处理来清理你的 BIO
实例以防出错(比如你链接到的答案),但这不是导致错误结果的原因.
已解决:问题已解决,问题是 fwrite 。使用 ofstream 写入函数修复
我想用 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 写入函数修复
您读取 base64 数据的代码非常混乱:
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;
您将数据读取到一个名为 result
的字符串中,但您从未对其进行任何操作。然后将暂存缓冲区的内容复制到输出缓冲区中。你也可以取消你的 size
指针,只是 return 一个 std::string
而不是原始的 char*
.
另一个可能的问题是线路
BIO_set_flags(p_bio_b64, BIO_FLAGS_BASE64_NO_NL); //Don't require trailing newlines
如果您的输入确实包含换行符,那么该行将导致问题。如果你想使用可能包含或不包含换行符的输入,你需要使该行有条件:
if (input.find('\n') == std::string::npos) {
BIO_set_flags(p_bio_b64, BIO_FLAGS_BASE64_NO_NL); //Don't require trailing newlines
}
加在一起,看起来像这样:
std::string base64_decode(const std::string &input)
{
BIO *p_bio_mem = nullptr;
BIO *p_bio_b64 = nullptr;
p_bio_b64 = BIO_new(BIO_f_base64());
if (!p_bio_b64) { throw std::runtime_error("BIO_new failed"); }
if (input.find('\n') == std::string::npos) {
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);
std::stringstream result;
std::vector<char> buf(1024);
while (auto nread = BIO_read(p_bio_b64, buf.data(), buf.size()))
{
if (nread < 0) { throw std::runtime_error("OMGZ"); } //fail
result.write(buf.data(), nread);
}
BIO_free_all(p_bio_b64);
return result.str();
}
你可能还想添加一些错误处理来清理你的 BIO
实例以防出错(比如你链接到的答案),但这不是导致错误结果的原因.
已解决:问题已解决,问题是 fwrite 。使用 ofstream 写入函数修复