微信图片解码原理与代码
bool WxImageDecode(string filename)
{
unsigned char* key;
unsigned char byte;
unsigned short value, value2;
char* jpegData;
ULONGLONG jpegLen;
BOOL ret;
CFile file;
ret = file.Open(filename.c_str(), CFile::modeRead | CFile::typeBinary);
if (!ret)
return false;
jpegData = new char[file.GetLength()];
ZeroMemory(jpegData, file.GetLength());
ret = file.Read(&value, 2);
key = (unsigned char*)&value2;
do
{
value2 = value ^ 0xd8ff;
if (key[0] == key[1])
break;
value2 = value ^ 0x5089;
if (key[0] == key[1])
break;
delete[]jpegData;
file.Close();
return false;
} while (0);
file.SeekToBegin();
jpegLen = 0;
while (true)
{
ret = file.Read(&byte, 1);
if (ret < 1)
break;
jpegData[jpegLen] = byte ^ key[0];
jpegLen++;
}
file.Close();
if (jpegLen > 0) {
int pos = filename.find("dat");
filename.replace(pos, 3, "png");
ret = file.Open(filename.c_str(), CFile::modeWrite | CFile::typeBinary | CFile::modeCreate);
if (ret) {
file.Write(jpegData, jpegLen);
file.Close();
delete[]jpegData;
return true;
}
}
delete[]jpegData;
return false;
}