亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C/C++信息隱寫術(二)之字符串藏入BMP文件

2019-11-14 09:09:05
字體:
來源:轉載
供稿:網友

我們這一節用代碼實現,把字符串藏入BMP文件,并且能正常讀取出來。

看這篇的同學請先閱讀第一篇了解理論:

http://blog.csdn.net/QQ78442761/article/details/54863034

下面開始進入此節:

從上一節,我們知道了Bmp文件的結構,如下圖所示:

其中最關鍵的兩個結構體BITMAPFILEHEADER和BITMAPINFOHEADER,這里面保存了這個Bmp文件的很多信息。

恰好,Windows給我們提供了這個兩個結構體,如下圖所示:

typedef struct tagBITMAPFILEHEADER {        Word    bfType;        DWORD   bfSize;        WORD    bfReserved1;        WORD    bfReserved2;        DWORD   bfOffBits;} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER{        DWORD      biSize;        LONG       biWidth;        LONG       biHeight;        WORD       biplanes;        WORD       biBitCount;        DWORD      biComPRession;        DWORD      biSizeImage;        LONG       biXPelsPerMeter;        LONG       biYPelsPerMeter;        DWORD      biClrUsed;        DWORD      biClrImportant;} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;我們在到010Editor看看(圖如下):

關于高度為負的問題,在第一節已經說明,不知道的同學請從文章最上面的鏈接進入第一節。在此不再說明。

那么問題就簡單了,現在這個程序的思路就是:

1.用C/C++代碼讀取圖片文件里面的這兩個結構體。

2.讀取這個文件到內存中。

3.獲取bfOffBIts,再獲取alpha通道(+4)。

4.把數據拆分,插入到alpha通道。

5.保存文件。

6.讀取被修改文件的alpha通道,組合成字符串。

理論就是這么簡單:

下面是程序源碼打包下載地址:

http://download.csdn.net/detail/qq78442761/9747338

下面是程序源碼:

dwBmpSize.h

#pragma  once#include <string>#include <Windows.h>using namespace std;class CBMPHide{public:	CBMPHide();	~CBMPHide();	bool setBmpFileName(char* szFileName);	//設置Bmp文件名	int getBmpWidth();	//獲取寬度	int getBmpHeight();	//獲取高度	int getBmpBitCount();	//獲取Bit總數	bool save();	bool hideString2BMP(char* szStr2Hide);	//隱藏String到BMP文件中	void showStringInBmp(char* szBmpFIleName=NULL);	//展示private:	DWORD dwBmpSize;	//圖片文件大小	string sBmpFileName;	LPBYTE pBuf;	//用于存放圖片信息的內存	BITMAPFILEHEADER* m_fileHdr;	BITMAPINFOHEADER* m_infoHdr;};dwBmpSIze.cpp

#include "dwBmpSize.h"CBMPHide::CBMPHide(){	sBmpFileName = "";	pBuf = 0;	dwBmpSize = 0;}CBMPHide::~CBMPHide(){}bool CBMPHide::setBmpFileName(char* szFileName){	this->sBmpFileName = szFileName;	if (pBuf)	//如果已經生成就釋放掉	{		delete[]pBuf;	}	HANDLE hfile = CreateFileA(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);	if (hfile == INVALID_HANDLE_VALUE)	{		return false;	}	//和struct BITMAPFILEHEADER bmfh里面的 bfSize的大小應該是一樣的。	dwBmpSize = GetFileSize(hfile, 0);	//獲取文件的大小	pBuf = new byte[dwBmpSize];	DWORD dwRead = 0;	ReadFile(hfile, pBuf, dwBmpSize, &dwRead, 0);	if (dwRead != dwBmpSize)	{		delete[]pBuf;		pBuf = 0;		return false;	}	CloseHandle(hfile);	m_fileHdr = (BITMAPFILEHEADER*)pBuf;	m_infoHdr = (BITMAPINFOHEADER*)(pBuf + sizeof(BITMAPFILEHEADER));	return true;	//成功話就是文件的內容讀取到pBuf里面}int CBMPHide::getBmpWidth(){	return m_infoHdr->biWidth;}int CBMPHide::getBmpHeight(){	return m_infoHdr->biHeight;}int CBMPHide::getBmpBitCount(){	return m_infoHdr->biBitCount;}bool CBMPHide::save(){	string sDstFileName = sBmpFileName + ".hide.bmp";	HANDLE hfile = CreateFileA(sDstFileName.c_str(),		GENERIC_READ | GENERIC_WRITE,		FILE_SHARE_READ | FILE_SHARE_WRITE,		NULL,		CREATE_ALWAYS, 0, 0);	if (hfile == INVALID_HANDLE_VALUE)	{		return false;	}	DWORD dwWritten = 0;	WriteFile(hfile, pBuf, dwBmpSize, &dwWritten, 0);	if (dwBmpSize != dwWritten)	{		return false;	}	CloseHandle(hfile);	return true;}//隱藏一個字符串到圖片中,把字符串拆成字節,寫入每個像素的alpha通道中bool CBMPHide::hideString2BMP(char* szStr2Hide){	LPBYTE pAlpha = pBuf + m_fileHdr->bfOffBits + 3;	//第一個像素的通道位置	int nHide;	//成功隱藏的字節數	//每次循環寫入一個字節,吸入alpha通道	//(pAlpha - pBuf) < m_fileHdr->bfSize這個是判斷字符串是太大,圖片不能隱藏	for (nHide = 0; (pAlpha - pBuf) < m_fileHdr->bfSize && szStr2Hide[nHide] != 0; nHide++, pAlpha += 4)	{		*pAlpha = szStr2Hide[nHide];	//寫入一個字節	}	return true;}void CBMPHide::showStringInBmp(char* szBmpFIleName/*=NULL*/){	string sDstFileName="";	if (szBmpFIleName == 0)	{		sDstFileName = sBmpFileName + ".hide.bmp";	}	else		sDstFileName = szBmpFIleName;	HANDLE hfile = CreateFileA(sDstFileName.c_str(),		GENERIC_READ | GENERIC_WRITE,		FILE_SHARE_READ | FILE_SHARE_WRITE,		NULL,		OPEN_EXISTING, 0, 0);	if (hfile == INVALID_HANDLE_VALUE)	{		return;	}	DWORD dwSize = GetFileSize(hfile, 0);	LPBYTE pBuf1 = new byte[dwSize];	DWORD dwRead = 0;	ReadFile(hfile, pBuf1, dwSize, &dwRead, 0);	CloseHandle(hfile);	//文件內容讀取到pBuf1中	BITMAPFILEHEADER *pHdr = (BITMAPFILEHEADER *)pBuf1;	LPBYTE pStr = pBuf1 + pHdr->bfOffBits + 3;	char szTmp[1280];	RtlZeroMemory(szTmp, 1280);	for (int i = 0; i < 1280; i++)	{		if (*pStr == 0 || *pStr == 0xFF)		{			break;		}		szTmp[i] = *pStr;		pStr += 4;	}	printf_s(szTmp);	delete[]pBuf1;}

main.h

#include <stdio.h>#include "dwBmpSize.h"int main(){	CBMPHide hide;	hide.setBmpFileName("test.bmp");	printf_s("test.bmp width:%d,height:%d,bitCount%d/n",		hide.getBmpWidth(),		hide.getBmpHeight(),		hide.getBmpBitCount());	hide.hideString2BMP("Hello Word");	hide.save();	hide.showStringInBmp("test.bmp.hide.bmp");	getchar();	return 0;}程序運行結果如下:

在此不一一舉出。

在這里:可能出現特殊情況,比如寫入了0或oxFF(判斷自有數據是否結束標志)

在下面一節中,我們解決這個問題,并且,把一個不大的txt文本插入到圖片里面去。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品亚洲精品| 亚洲精品av在线播放| 久久久久五月天| 久久亚洲影音av资源网| 色综合91久久精品中文字幕| 尤物精品国产第一福利三区| 亚洲成人av在线| 亚洲丝袜av一区| 欧美日韩福利电影| 狠狠操狠狠色综合网| 亚洲精品视频中文字幕| 亚洲一区二区三区视频播放| 人妖精品videosex性欧美| 伊人精品在线观看| 日韩av片电影专区| 久久九九精品99国产精品| 国产区精品在线观看| 亚洲女同精品视频| 国产精品午夜一区二区欲梦| 国产91精品久久久| 在线观看91久久久久久| 欧美国产亚洲精品久久久8v| 欧美一级bbbbb性bbbb喷潮片| 国产成人在线精品| 91亚洲精品久久久久久久久久久久| 欧美日韩激情视频8区| 国产va免费精品高清在线| 成人做爽爽免费视频| 欧美成人精品激情在线观看| 草民午夜欧美限制a级福利片| 黑人狂躁日本妞一区二区三区| 国产91|九色| 国产亚洲精品久久久久久牛牛| 91大神在线播放精品| 国内精品模特av私拍在线观看| 精品一区二区亚洲| 亚洲国产精品中文| 亚洲欧美激情在线视频| 精品福利在线视频| 欧美激情在线有限公司| 精品久久久久久中文字幕大豆网| 久久免费视频在线观看| 亚洲国产古装精品网站| 精品国产福利视频| 成人午夜激情免费视频| 国产日韩中文字幕在线| 国产精品精品视频| 成人网址在线观看| 国产欧美日韩中文| 青青草原一区二区| 欧美久久精品午夜青青大伊人| 青青久久av北条麻妃海外网| 久久精品国产欧美激情| 国产精品2018| 久久国产精品视频| 欧美日韩在线观看视频| 国产日产久久高清欧美一区| 欧美日韩aaaa| 亚洲天堂成人在线视频| 亚洲成人免费网站| 国产精品露脸自拍| 亚洲视频第一页| 欧美极品少妇与黑人| 欧美大片在线免费观看| 成人黄色网免费| 97人洗澡人人免费公开视频碰碰碰| 日韩久久精品电影| 亚洲r级在线观看| 久久久精品久久久久| 久久国产精品久久久久久| 欧美国产日韩二区| 国模叶桐国产精品一区| 亚洲一区二区少妇| 久久久精品影院| 欧美性20hd另类| 欧美日韩性生活视频| 国产97在线播放| 欧美性黄网官网| 欧美激情在线视频二区| 日韩在线国产精品| 91精品综合久久久久久五月天| 国产一区二区三区久久精品| 久久99久久99精品免观看粉嫩| 精品国产一区二区三区久久狼5月| 91chinesevideo永久地址| 亚洲欧美中文日韩在线v日本| 精品国产依人香蕉在线精品| 欧美性生交xxxxxdddd| 亚洲第一免费网站| 欧美成人免费大片| 亚洲成年人影院在线| 久久成人国产精品| 日韩亚洲精品视频| 91精品国产91久久久久久久久| 日韩av在线免费播放| 毛片精品免费在线观看| 亚洲欧洲偷拍精品| 最近2019中文免费高清视频观看www99| 亚洲欧美日韩综合| 在线日韩日本国产亚洲| 亚洲精品视频免费| www.欧美三级电影.com| 亚洲九九九在线观看| 国产成人精品av| 国产精品久久久久91| 青青久久av北条麻妃黑人| 欧美老少配视频| 亚洲精品午夜精品| 米奇精品一区二区三区在线观看| 精品人伦一区二区三区蜜桃免费| 日韩有码片在线观看| 国产精品日韩在线| 国产精品久久99久久| 成人黄色网免费| 国产精品久久久久久久7电影| 国产视频亚洲精品| 日韩中文字在线| 亚洲国产成人精品女人久久久| 国产精品日韩一区| 亚洲第一精品夜夜躁人人躁| 亚洲欧洲一区二区三区在线观看| 亚洲国产成人av在线| 爽爽爽爽爽爽爽成人免费观看| 亚洲风情亚aⅴ在线发布| 欧美国产日韩一区二区| 国产精品男女猛烈高潮激情| 日韩国产精品一区| 狠狠色香婷婷久久亚洲精品| 欧美激情在线一区| 中文字幕亚洲欧美一区二区三区| 亚洲无av在线中文字幕| 日韩人体视频一二区| 久久久久久尹人网香蕉| 亚洲精品国产综合区久久久久久久| 日韩动漫免费观看电视剧高清| 96sao精品视频在线观看| 精品福利视频导航| 日韩激情视频在线播放| 日韩免费av片在线观看| 欧美日韩视频免费播放| 91日本视频在线| 亚洲第一福利网站| 亚洲福利视频专区| 国产午夜精品美女视频明星a级| 91中文在线视频| 久久精品视频在线观看| 亚洲视频专区在线| 97精品一区二区三区| 尤物99国产成人精品视频| 狠狠做深爱婷婷久久综合一区| 亚洲精品视频在线观看视频| 日韩欧美在线免费观看| 久久精品国亚洲| 91精品在线看| 国产欧美日韩免费| 美女扒开尿口让男人操亚洲视频网站| 日韩精品视频免费在线观看| 国产日产久久高清欧美一区| 亚洲欧美日韩精品久久奇米色影视| 国产一区二中文字幕在线看| 97avcom| 国产日韩欧美在线看| 国产精品久久精品| 亚洲人成亚洲人成在线观看|