c++ - Base64 图像编码不正确
问题描述
我正在尝试将 .jpg 文件转换为 base64,然后转换为 svg 文件,但我的 base64 错误我不知道我是否在做明显错误的事情这是我第一次在 c++ 中使用 base64
当我运行代码时,我得到一个格式正确且填充正确的 svg 文件,但是当我打开它时该文件是空白的。
这是我的代码:
#include <iostream>
#include <fstream>
#include <string>
#include "base64.h"
#include "base64.cpp"
int main()
{
bool url;
std::string image;
std::string encoded;
std::string alldata = "";
std::cout << "Name of file without extension: \n";
std::cin >> image;
// Takes the name of the image
std::string outfile = image + ".svg";
// creates outfiles
image = image + ".jpg";
// adds jpg extension to name of file
std::string line;
std::ifstream input(image, std::ios::in | std::ios::binary);
// opens the image
if (input.is_open()) {
// checks if the file is open
while (getline(input, line)) {
// std::string encoded = base64_encode_mime(const& s);
alldata = alldata + (line.c_str());
// makes multiple lines into one
}
input.close();
}
else {
std::cout << "ERROR: File not found";
}
encoded = base64_encode(reinterpret_cast<const unsigned char*>(alldata.c_str()), alldata.length(), url = false);
// encodes the one line of image data
std::string svg;
std::ofstream output(outfile,std::ios::binary|std::ios::out);
svg = "<?xml version='1.0' encoding='UTF-8' standalone='no'?> <!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'> <svg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='1920px' height='1200px' viewBox='0 0 1920 1200' enable-background='new 0 0 1920 1200' xml:space='preserve'> <image id='image0' width='1920' height='1200' x='0' y='0' href='data:image/png;base64,";
svg = svg + encoded;
svg = svg + "'/> </svg>";
output << svg;
}
我正在使用 René Nyffenegger 在这里找到的 base64 库:https ://github.com/ReneNyffenegger/cpp-base64/blob/master/base64.cpp 我已经测试了这个库,它似乎可以正确编码文本。
解决方案
您的错误在于您从文件中读取数据的方式。不要getline
在二进制文件上使用,除此之外它不会将换行符返回给您。第二个问题是,c_str()
当您追加每一行时,您假设数据中不会有空字符,这不太可能是真的。
最简单的方法是一次读取一个字符的文件
if (input.is_open()) {
char ch;
while (input.get(ch)) {
alldata += ch;
}
}
推荐阅读
- linux - 发出“gnome-session-quit --power-off”后如何从命令行取消关机
- linux - 在 Linux 上安装 TensorFlow 2.2
- java - 如何对 S3Events getRecords 进行单元测试?
- visual-studio - Visual Studio 加载速度太慢,即使是一个小项目也无法加载
- java - 有没有办法让两个不同的对象有一些相同的方法?
- null - 有没有办法将 PowerBI/Power Query 中日期数据类型列中的空值转换为空白?
- php - php artisan storage:使用 Laravel 和 Docker 时的链接问题
- amazon-dynamodb - 估计通过 Data Pipeline 导出 DynamoDB 数据的持续时间
- java - 显示为混合分数输入的值时出错
- swift - 根据函数的输出分配变量字符串值