【发布时间】:2020-11-19 09:54:10
【问题描述】:
我在我的 c++ 服务器上以 json 值发送以 Base64 编码的图像,并尝试将其解码并作为 .jpg 文件保存在磁盘上。而且我在解码时遇到问题,它保存在磁盘上但没有打开,输入和输出文件的大小略有不同(40.8 kb 与 41.1 kb)。 我尝试了 3 种不同的解码代码,这是最后一种:
typedef unsigned char uchar;
static const std::string b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//=
std::string PictureManager::base64_decode(const std::string& in) {
std::string out;
std::vector<int> T(256, -1);
for (int i = 0; i < 64; i++) T[b[i]] = i;
int val = 0, valb = -8;
for (uchar c : in) {
if (T[c] == -1) break;
val = (val << 6) + T[c];
valb += 6;
if (valb >= 0) {
out.push_back(char((val >> valb) & 0xFF));
valb -= 8;
}
}
return out;
}
这是我的保存功能:
bool PictureManager::SavePicture(std::string DecodedString)
{
std::ofstream Picture;
Picture.open("PicturePatch.jpg");
if (!Picture.is_open())
{
std::cout << "Error in opening file!" << std::endl;
return false;
}
/*for(std::vector<BYTE>::iterator it = DecodedString.begin(); it != DecodedString.end(); it++)
{
Picture << *it;
}*/
Picture << DecodedString;
return true;
}
请帮忙
【问题讨论】:
-
您忘记将文件作为二进制文件打开。另见
write方法的使用:Writing binary data to fstream in c++ -
您将图片文件作为文本打开,而不是二进制。这可能是问题所在,您提供了对我有用的解码方法,而问题可能在于编码或图像读取(也作为文本而不是二进制?)。
-
@Botje 我只是使用二进制模式和这个“std::ios::app | std::ios::binary”,它可以工作,非常感谢你的伙伴!再来一次!)
-
只是二进制标志,我认为您不想附加到现有文件。
-
@SHR 是的,正是我需要的,以二进制模式打开,谢谢!