如何将代码写入 图片或者文本文档 视频 音频这些文件

活动撒谎飞机棵 2014-11-07 07:41:34
RT
如何将代码写入 图片或者文本文档 视频 音频这些文件
求指点 最好能给个代码研究
...全文
284 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 hhhh63 的回复:
两个方法,一是用代码数据直接替换原来的图像数据,用PNG等还能压缩和还原,直接打开图像就是杂乱无章的点点。 二是二进制方法,把原图像数据的最后一位按代码的二进制流强置0或1,这个方法原图像看起来没有变化,但要求图像比较大。以下是我实际试验的方法,把js文件写到png图片中,在客户端用canvas解码。
void CintopngDlg::OnBnClickedOk()
{
	//把js文件和其它数据文件写入png文件中,在客户端解码
	CFile ff;
	ff.Open(L"xxxx\\script.min.js", CFile::modeRead);
	int jslen = (int)ff.GetLength();
	PBYTE ffbuf = new BYTE[jslen];
	ff.Read(ffbuf, jslen);
	ff.Close();

	// 打开原始图像文件,不含js数据,原始图像已经加高,预留js数据区
	CImage img;
	img.Load(L"xxxx\\images\\png11.png");
	int bpp = img.GetBPP();	// 图像颜色位数
	ASSERT(bpp == 32);	// 一定是32位
	bpp /= 8;
	int w = img.GetWidth();
	int h = img.GetHeight();
	ASSERT(jslen < w * h * bpp);
	// h > 0 时,图像数据的排列方法是,从左到右,从下到上,
	// img.GetBits() 获取图像第一行的地址,在数据区的最后一行。
	// 以下方法取图像的最后一行数据,在内存数据区的第一行。
	PBYTE buf = PBYTE(img.GetBits()) - w * (h-1) * bpp;

	// js文件写到图像文件中,即加密,又能压缩传送,所有4的倍数字节是必须ff,为完全不透明,否则js端不能还原正确的值。
	// 数据头共12个字节,前三个字节是长度,第四个字节是ff,接着3个字节是长度的hashcode验证长度用,第八个字节是ff,第9-11字节是全部数据(不包括数据头)的hashcode,用于验证数据
	PBYTE ps = ffbuf;
	PBYTE pd = buf + 12;	// 留出数据头
	int j = 1;
	int hashcode = 0;
	for (int i = 0; i < jslen; i++, j++ )
	{
		if (!(j & 3))
		{
			*pd++ = 0xff;	// 每三个字节后面插补ff,32位颜色的透明度,必须设为完全不透明,否则js端不能还原正确的值。
			j++;
		}
		hashcode = hashcode * 31 + *ps;// hashcode算法http://zhhphappy.iteye.com/blog/1124283
		*pd++ = *ps++;
	}
	for (; j & 3; j++)
		*pd++ = 0x20;	// 用空格补齐最后一个颜色
	*pd = 0xff;	// 最后一个透明度

	*(PINT)buf = (jslen | 0xff000000);	// 长度,不包括插补的ff和补齐的空格
	*(PINT)(buf + 4) = ((jslen * 31) | 0xff000000);	// 全部数据哈希码,不包括插补的ff和补齐的空格和数据差距
	*(PINT)(buf + 8) = (hashcode | 0xff000000);	// 全部数据哈希码,不包括插补的ff和补齐的空格和数据差距

	delete ffbuf;
	ffbuf = 0;

	img.Save(L"xxxx\\images\\png1.png");

	AfxMessageBox(L"编译成功。");
}
还有个问题想请教一下 你这个代码是把别的文件写入图片 如果想把程序自身的代码写入图片该怎么做?
dvlinker 2014-11-09
  • 打赏
  • 举报
回复
引用 1 楼 hhhh63 的回复:
两个方法,一是用代码数据直接替换原来的图像数据,用PNG等还能压缩和还原,直接打开图像就是杂乱无章的点点。 二是二进制方法,把原图像数据的最后一位按代码的二进制流强置0或1,这个方法原图像看起来没有变化,但要求图像比较大。以下是我实际试验的方法,把js文件写到png图片中,在客户端用canvas解码。
void CintopngDlg::OnBnClickedOk()
{
	//把js文件和其它数据文件写入png文件中,在客户端解码
	CFile ff;
	ff.Open(L"xxxx\\script.min.js", CFile::modeRead);
	int jslen = (int)ff.GetLength();
	PBYTE ffbuf = new BYTE[jslen];
	ff.Read(ffbuf, jslen);
	ff.Close();

	// 打开原始图像文件,不含js数据,原始图像已经加高,预留js数据区
	CImage img;
	img.Load(L"xxxx\\images\\png11.png");
	int bpp = img.GetBPP();	// 图像颜色位数
	ASSERT(bpp == 32);	// 一定是32位
	bpp /= 8;
	int w = img.GetWidth();
	int h = img.GetHeight();
	ASSERT(jslen < w * h * bpp);
	// h > 0 时,图像数据的排列方法是,从左到右,从下到上,
	// img.GetBits() 获取图像第一行的地址,在数据区的最后一行。
	// 以下方法取图像的最后一行数据,在内存数据区的第一行。
	PBYTE buf = PBYTE(img.GetBits()) - w * (h-1) * bpp;

	// js文件写到图像文件中,即加密,又能压缩传送,所有4的倍数字节是必须ff,为完全不透明,否则js端不能还原正确的值。
	// 数据头共12个字节,前三个字节是长度,第四个字节是ff,接着3个字节是长度的hashcode验证长度用,第八个字节是ff,第9-11字节是全部数据(不包括数据头)的hashcode,用于验证数据
	PBYTE ps = ffbuf;
	PBYTE pd = buf + 12;	// 留出数据头
	int j = 1;
	int hashcode = 0;
	for (int i = 0; i < jslen; i++, j++ )
	{
		if (!(j & 3))
		{
			*pd++ = 0xff;	// 每三个字节后面插补ff,32位颜色的透明度,必须设为完全不透明,否则js端不能还原正确的值。
			j++;
		}
		hashcode = hashcode * 31 + *ps;// hashcode算法http://zhhphappy.iteye.com/blog/1124283
		*pd++ = *ps++;
	}
	for (; j & 3; j++)
		*pd++ = 0x20;	// 用空格补齐最后一个颜色
	*pd = 0xff;	// 最后一个透明度

	*(PINT)buf = (jslen | 0xff000000);	// 长度,不包括插补的ff和补齐的空格
	*(PINT)(buf + 4) = ((jslen * 31) | 0xff000000);	// 全部数据哈希码,不包括插补的ff和补齐的空格和数据差距
	*(PINT)(buf + 8) = (hashcode | 0xff000000);	// 全部数据哈希码,不包括插补的ff和补齐的空格和数据差距

	delete ffbuf;
	ffbuf = 0;

	img.Save(L"xxxx\\images\\png1.png");

	AfxMessageBox(L"编译成功。");
}
赞一个!
阿良良木月火 2014-11-09
  • 打赏
  • 举报
回复
两位大神在讨论什么
神-气 2014-11-09
  • 打赏
  • 举报
回复
楼主知道jpg和rar的故事么,你可以同样的在jpg文件最后面添加加密过的二进制代码数据,这样打开还是图片,但是用你的解析程序可以还原得到代码。
hhhh63 2014-11-09
  • 打赏
  • 举报
回复
一样的,取一段内存写进去
hhhh63 2014-11-08
  • 打赏
  • 举报
回复
两个方法,一是用代码数据直接替换原来的图像数据,用PNG等还能压缩和还原,直接打开图像就是杂乱无章的点点。 二是二进制方法,把原图像数据的最后一位按代码的二进制流强置0或1,这个方法原图像看起来没有变化,但要求图像比较大。以下是我实际试验的方法,把js文件写到png图片中,在客户端用canvas解码。
void CintopngDlg::OnBnClickedOk()
{
	//把js文件和其它数据文件写入png文件中,在客户端解码
	CFile ff;
	ff.Open(L"xxxx\\script.min.js", CFile::modeRead);
	int jslen = (int)ff.GetLength();
	PBYTE ffbuf = new BYTE[jslen];
	ff.Read(ffbuf, jslen);
	ff.Close();

	// 打开原始图像文件,不含js数据,原始图像已经加高,预留js数据区
	CImage img;
	img.Load(L"xxxx\\images\\png11.png");
	int bpp = img.GetBPP();	// 图像颜色位数
	ASSERT(bpp == 32);	// 一定是32位
	bpp /= 8;
	int w = img.GetWidth();
	int h = img.GetHeight();
	ASSERT(jslen < w * h * bpp);
	// h > 0 时,图像数据的排列方法是,从左到右,从下到上,
	// img.GetBits() 获取图像第一行的地址,在数据区的最后一行。
	// 以下方法取图像的最后一行数据,在内存数据区的第一行。
	PBYTE buf = PBYTE(img.GetBits()) - w * (h-1) * bpp;

	// js文件写到图像文件中,即加密,又能压缩传送,所有4的倍数字节是必须ff,为完全不透明,否则js端不能还原正确的值。
	// 数据头共12个字节,前三个字节是长度,第四个字节是ff,接着3个字节是长度的hashcode验证长度用,第八个字节是ff,第9-11字节是全部数据(不包括数据头)的hashcode,用于验证数据
	PBYTE ps = ffbuf;
	PBYTE pd = buf + 12;	// 留出数据头
	int j = 1;
	int hashcode = 0;
	for (int i = 0; i < jslen; i++, j++ )
	{
		if (!(j & 3))
		{
			*pd++ = 0xff;	// 每三个字节后面插补ff,32位颜色的透明度,必须设为完全不透明,否则js端不能还原正确的值。
			j++;
		}
		hashcode = hashcode * 31 + *ps;// hashcode算法http://zhhphappy.iteye.com/blog/1124283
		*pd++ = *ps++;
	}
	for (; j & 3; j++)
		*pd++ = 0x20;	// 用空格补齐最后一个颜色
	*pd = 0xff;	// 最后一个透明度

	*(PINT)buf = (jslen | 0xff000000);	// 长度,不包括插补的ff和补齐的空格
	*(PINT)(buf + 4) = ((jslen * 31) | 0xff000000);	// 全部数据哈希码,不包括插补的ff和补齐的空格和数据差距
	*(PINT)(buf + 8) = (hashcode | 0xff000000);	// 全部数据哈希码,不包括插补的ff和补齐的空格和数据差距

	delete ffbuf;
	ffbuf = 0;

	img.Save(L"xxxx\\images\\png1.png");

	AfxMessageBox(L"编译成功。");
}
Sandrer 2014-11-08
  • 打赏
  • 举报
回复
楼主的题目不知所云,1#居然知道怎么回答,厉害厉害
  • 打赏
  • 举报
回复
引用 1 楼 hhhh63 的回复:
两个方法,一是用代码数据直接替换原来的图像数据,用PNG等还能压缩和还原,直接打开图像就是杂乱无章的点点。 二是二进制方法,把原图像数据的最后一位按代码的二进制流强置0或1,这个方法原图像看起来没有变化,但要求图像比较大。以下是我实际试验的方法,把js文件写到png图片中,在客户端用canvas解码。
void CintopngDlg::OnBnClickedOk()
{
	//把js文件和其它数据文件写入png文件中,在客户端解码
	CFile ff;
	ff.Open(L"xxxx\\script.min.js", CFile::modeRead);
	int jslen = (int)ff.GetLength();
	PBYTE ffbuf = new BYTE[jslen];
	ff.Read(ffbuf, jslen);
	ff.Close();

	// 打开原始图像文件,不含js数据,原始图像已经加高,预留js数据区
	CImage img;
	img.Load(L"xxxx\\images\\png11.png");
	int bpp = img.GetBPP();	// 图像颜色位数
	ASSERT(bpp == 32);	// 一定是32位
	bpp /= 8;
	int w = img.GetWidth();
	int h = img.GetHeight();
	ASSERT(jslen < w * h * bpp);
	// h > 0 时,图像数据的排列方法是,从左到右,从下到上,
	// img.GetBits() 获取图像第一行的地址,在数据区的最后一行。
	// 以下方法取图像的最后一行数据,在内存数据区的第一行。
	PBYTE buf = PBYTE(img.GetBits()) - w * (h-1) * bpp;

	// js文件写到图像文件中,即加密,又能压缩传送,所有4的倍数字节是必须ff,为完全不透明,否则js端不能还原正确的值。
	// 数据头共12个字节,前三个字节是长度,第四个字节是ff,接着3个字节是长度的hashcode验证长度用,第八个字节是ff,第9-11字节是全部数据(不包括数据头)的hashcode,用于验证数据
	PBYTE ps = ffbuf;
	PBYTE pd = buf + 12;	// 留出数据头
	int j = 1;
	int hashcode = 0;
	for (int i = 0; i < jslen; i++, j++ )
	{
		if (!(j & 3))
		{
			*pd++ = 0xff;	// 每三个字节后面插补ff,32位颜色的透明度,必须设为完全不透明,否则js端不能还原正确的值。
			j++;
		}
		hashcode = hashcode * 31 + *ps;// hashcode算法http://zhhphappy.iteye.com/blog/1124283
		*pd++ = *ps++;
	}
	for (; j & 3; j++)
		*pd++ = 0x20;	// 用空格补齐最后一个颜色
	*pd = 0xff;	// 最后一个透明度

	*(PINT)buf = (jslen | 0xff000000);	// 长度,不包括插补的ff和补齐的空格
	*(PINT)(buf + 4) = ((jslen * 31) | 0xff000000);	// 全部数据哈希码,不包括插补的ff和补齐的空格和数据差距
	*(PINT)(buf + 8) = (hashcode | 0xff000000);	// 全部数据哈希码,不包括插补的ff和补齐的空格和数据差距

	delete ffbuf;
	ffbuf = 0;

	img.Save(L"xxxx\\images\\png1.png");

	AfxMessageBox(L"编译成功。");
}
高人啊 小弟正在试验 等完成了 就来结贴给分 谢谢啊
sichuanwww 2014-11-08
  • 打赏
  • 举报
回复
这是明显要整事的节奏,暴露太明显了哈。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧