📄 hideinfo.cpp
字号:
// HideInFo.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream.h"
#include "stdio.h"
#include "BitOperate.h"
#include "stdlib.h"
#include "ctype.h"
#include"conio.h"
#include <string.h>
#define MAX 1000
typedef unsigned char byte;
/*1. BMP文件头
BMP文件头数据结构含有BMP文件的类型、
文件大小和位图起始位置等信息。其结构定义如下:
*/
typedef struct tagBitMapFileHeader
{
byte bfType[2]; // 位图文件的类型,必须为"BM"
byte bfSize[4]; // 位图文件的大小,以字节为单位
byte bfReserved1[2]; // 位图文件保留字,必须为0
byte bfReserved2[2]; // 位图文件保留字,必须为0
byte bfOffBits[4]; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
} *BitMap;//该结构占据14个字节。
/*功能:返回图像的长度*/
int getValue(byte*A,int num)
{
int result = 0;
for(int i = num-1;i>0;i--)
{
result+=A[i];
result = result<<8;
}
result+=A[0];
return result;
}
/*功能:将信息隐藏到图片中*/
void hideInFo()
{
FILE* fp;
char data[MAX];
BitOperate operate;
if((fp = fopen("HideInFo.bmp", "r+"))==NULL)
{
cout<<"打开文件的时候出现错误!"<<endl;
return;
}
BitMap map = //存放文件头信息;
(BitMap)malloc(sizeof(struct tagBitMapFileHeader ));
fread(map,sizeof(struct tagBitMapFileHeader ),1,fp);
printf("Input the data you want to hide:\n");
gets(data);
int datalength = strlen(data);
int maplength = getValue(map->bfSize,4);
int databegin = getValue(map->bfOffBits,4);
if((datalength*8)>(maplength-databegin))
{
printf("The data is too long!Choose a bigger picture or hide it in pieces!\n");
return;
}
printf("#######Datalength = %d\n",datalength);
printf("#######Malength = %d\n",maplength);
printf("DataBegin = %d\n",databegin);
//首先将文件的长度隐藏起来;
byte temp[32];
fseek(fp,databegin,SEEK_SET);//定位到数据块的起点;
fread(temp,sizeof(char)*32,1,fp);
int copy = datalength;
for(int i = 31;i>=0;i--)
{
bool v = (bool)(copy%2);
temp[i] = operate.bitSet(temp[i],1,v);
copy = copy/2;
}
fseek(fp,databegin,SEEK_SET);//定位到数据块的起点;
fwrite(temp,sizeof(byte)*32,1,fp);
//以下将数据信息隐藏到图像中;
int times = 0;
byte ch[8];
while(times<datalength)//加上隐藏的文件长度信息;
{
fseek(fp,databegin+32+times*8,SEEK_SET);//定位到数据块的起点;
fread(ch,sizeof(byte),8,fp);//读出8个字节;
for(int i = 7;i>=0;i--)
ch[i] = operate.bitSet(ch[i],1,operate.bitAt(data[times],8-i));
fseek(fp,databegin+32+times*8,SEEK_SET);//定位到数据块的起点;
fwrite(ch,sizeof(byte),8,fp);//写入8个字节;
times++;
}
fclose(fp);
}
/*将图片中隐藏的信息提取出来*/
void getInFo()
{
FILE* fp;
byte data[MAX];
BitOperate operate;
//注意,这个地方需要修改文件的路径,最好的办法是自己把路径输入,稍微修改下就可以了
if((fp = fopen("HideInFo.bmp", "r+"))==NULL)
{
cout<<"打开文件的时候出现错误!"<<endl;
return;
}
BitMap map = //存放文件头信息;
(BitMap)malloc(sizeof(struct tagBitMapFileHeader ));
fread(map,sizeof(struct tagBitMapFileHeader ),1,fp);
int databegin = getValue(map->bfOffBits,4);//得到数据块开始的偏移地址;
//获取文件的长度;
int datalength = 0;
//首先将隐藏文件的长度读出来;
byte temp[32];
fseek(fp,databegin,SEEK_SET);//定位到数据块的起点;
fread(temp,sizeof(char)*32,1,fp);
for(int i = 0;i<31;i++)
{
datalength += (int)operate.bitAt(temp[i],1);
datalength = datalength<<1;
}
datalength += (int)operate.bitAt(temp[31],1);
printf("\n\nDatalength = %d\n",datalength);
int times = 0;
byte ch[8];
while(times<datalength)//加上隐藏的文件长度信息;
{
fseek(fp,databegin+32+times*8,SEEK_SET);
fread(ch,sizeof(byte),8,fp);//读出8个字节;
//printf("\nch = %s\n",ch);
data[times] = 0;
for(int i = 0;i<7;i++)
{
data[times]+= (int)operate.bitAt(ch[i],1);
data[times] = data[times]*2;
}
data[times]+= (int)operate.bitAt(ch[7],1);
printf("%c",data[times]);
times++;
}
fclose(fp);
}
void main()
{
hideInFo();
getInFo();
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -