半是原创半是转载吧,说明是借用凉手抚温柔文章中的说明,代码原创,不过参考了一下开源中国的代码。
什么是图种:
一种采用特殊方式将图片文件(如jpg格式)与rar文件结合起来的文件。该文件一般保存为jpg格式,可以正常显示图片,当有人获取该图片后,可以修改文件的后缀名,将图片改为rar压缩文件,并得到其中的数据。由于这种方式通常为了一些网友传播种子文件,故称为图种,又叫内涵图。
原理:
Jpg,Png图片是以16进制的FFD9结尾的,其之后数据都会被自动忽略。
Rar格式的文件会将十六进制内容Rar!之前的内容全部忽略。
因此,只要用PHP读取图片文件和压缩文件,然后合并在一起就可以了。
代码:
//本程序的目的是合并图片和种子
//图片格式是jpg
//种子格式是rar压缩包
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int get_file_size(const char *filename)
{
int size;
FILE* fp = fopen( filename, "rb" );
fseek( fp, 0, SEEK_END );
size = ftell(fp);
fclose(fp);
return size;
}
//cmd命令:copy/b a.jpg+b.rar c.jpg
int main()
{
char picname[100] = "C:/Users/Administrator/Desktop/a.jpg";
char rarname[100] = "C:/Users/Administrator/Desktop/b.rar";
char resultname[100] = "C:/Users/Administrator/Desktop/c.jpg";
FILE *fp1, *fp2;
fp1 = fopen(picname, "rb");
fp2 = fopen(rarname, "rb");
FILE *w;
w = fopen(resultname, "wb");
int ch;
while((ch = fgetc(fp1)) != EOF)
fputc(ch, w);
while((ch = fgetc(fp2)) != EOF)
fputc(ch, w);
fclose(fp1);
fclose(fp2);
fclose(w);
}
/*
int main()
{
char picname[100] = "C:/Users/Administrator/Desktop/a.jpg";
char rarname[100] = "C:/Users/Administrator/Desktop/b.rar";
char resultname[100] = "C:/Users/Administrator/Desktop/c.jpg";
FILE *fp1, *fp2;
fp1 = fopen(picname, "rb");
fp2 = fopen(rarname, "rb");
int fs1, fs2;
fs1 = get_file_size(picname);
fs2 = get_file_size(rarname);
//std::cout<<fs1<<"\t"<<fs2<<std::endl;
char *f1, *f2;
f1 = new char[fs1];
f2 = new char[fs2];
fread(f1, sizeof(char), fs1, fp1);
fread(f2, sizeof(char), fs2, fp2);
fclose(fp1);
fclose(fp2);
system("pause");
FILE *w;
w = fopen(resultname, "wb");
int size = fs1+fs2;
char *combine = new char[size];
for (int i = 0; i< fs1; i++)
combine[i] = f1[i];
for (int i = fs1; i< fs1+fs2; i++)
combine[i] = f2[i-fs1];
//sprintf(combine, "%s%s", f1, f2);
//不能用sprintf函数,因为中间可能有'\0'
fwrite(combine, sizeof(char), size, w);
fclose(w);
}
int main()
{
char picname[100] = "C:/Users/Administrator/Desktop/a.jpg";
char rarname[100] = "C:/Users/Administrator/Desktop/b.rar";
char resultname[100] = "C:/Users/Administrator/Desktop/c.jpg";
FILE *fp1, *fp2;
fp1 = fopen(picname, "rb");
fp2 = fopen(rarname, "rb");
string combine;
int tmp;
while((tmp = fgetc(fp1)) != EOF)
combine += static_cast<char>(tmp);
while((tmp = fgetc(fp2)) != EOF)
combine += static_cast<char>(tmp);
fclose(fp1);
fclose(fp2);
system("pause");
FILE *w;
w = fopen(resultname, "wb");
for(string::iterator iter = combine.begin(); iter != combine.end(); ++iter)
fputc(*iter, w);
fclose(w);
return 0;
}
*/
需要说明的是,我如果使用的不是int ch,而是char ch,程序就不能正确处理。具体不明白为什么,可能和位数有关吧……希望哪位大神知道后告诉一声,不胜感激!