?? 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 + -