c++ 合并图种

半是原创半是转载吧,说明是借用凉手抚温柔文章中的说明,代码原创,不过参考了一下开源中国的代码。


什么是图种:

一种采用特殊方式将图片文件(如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,程序就不能正确处理。具体不明白为什么,可能和位数有关吧……希望哪位大神知道后告诉一声,不胜感激!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值