一个信息隐藏的程序有异常`请求帮忙调试

一个信息隐藏的程序有错误`请求帮忙调试
首先,将隐蔽载体文件(位图文件)装载进一个缓冲区pbmfh中,将所要隐藏的信息文件以二进制读方式也装载进一个缓冲区buffer中。
        其次,在嵌入信息时,将buffer中一个字节(8bit)的信息存入pbmfh中的8个字节中,并且保证这8个字节中的每个字节对2取模后与buffer中当前字节对应的位(8个字节对应8bit即对应一个字节)相同。具体实现是:将所要隐藏的文件的大小写入pbmfh缓冲区的0X0006地址处(以便提取信息时使用),从0X019A地址处开始读取位图文件的数据信息,如果pbmfh中的0X019A地址处的内容对2取模后与当前buffer中的内容的最高位不相同并且当前buffer中的内容也为0,则将pbmfh中的0X019A地址处的内容减1,否则pbmfh中的0X019A地址处的内容不变,接着从pbmfh中读取下一个字节,将该字节内容与当前buffer中的内容的次高位做上述判断,连续读取8个字节后,将指向buffer缓冲区的指针加1,将所要隐藏的文件的大小length减1,重复上述过程,直到length为0时嵌入信息过程完成。然后保存嵌入了信息后的位图文件。
        最后,在提取信息时,把嵌有机密信息的位图文件装载进缓冲区pbmfh中,从pbmfh缓冲区的0X0006地址处读取隐藏了信息的文件的大小并存入length中,从0X0008地址处读取隐藏了信息的文件的格式,从该缓冲区中一次读取8个字节,将这8个字节对2取模后,乘以各自的权(即128,64,32,16,8,4,2,1)后相加,得到原始文件中的一个字节并存入DEbuffer缓冲区中,将指向DEbuffer缓冲区的指针加1,将length的大小减1,重复上述过程,直到length为0时提取信息过程完成。最后将DEbuffer   缓冲区的内容以二进制方式写入文件中,
注:编译前操作一下:工程-》设置-》c/c++-> 分类选code   generation-> multithreaded             不然会出错`
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <afx.h>
bool   HideInformation()   //隐藏信息
{  
FILE   *fp1,*fp2;
        struct   stat   ST1,ST2;
        stat( "c:\\1.BMP ",   &ST1);
stat( "c:\\2.txt ",   &ST2);
fp1=fopen( "c:\\1.BMP ",   "rb ");
if(fp1==NULL){
printf( "open   file   of   carrier   is   false!   \n ");
return   false;
}
BYTE   *pbmfh   =   new   BYTE[ST1.st_size];
fread(pbmfh,   1,   ST1.st_size,   fp1);
fp2=fopen( "c:\\2.txt ",   "rb ");
if(fp2==NULL){
printf( "open   file   of   information   is   false!   \n ");
return   false;
}
BYTE   *buffer   =   new   BYTE   [ST2.st_size];
fread(buffer,   1,   ST2.st_size,   fp2);
unsigned   int   OpAND[8]={128,64,32,16,8,4,2,1};   //按位与&操作
char   tempbuffer=0;
int   i;
unsigned   int   length=ST2.st_size;
if(length==0)   //空文件
return   FALSE;
BYTE*   data=pbmfh+0x0006;
//隐藏length
BYTE   *pl=(BYTE   *)(&length);
for(   int   j=   0;   j   <   sizeof(int);   j++)
{
for(i=0;i <8;i++)
{
if((tempbuffer=(*pl)&OpAND[i])==0)   //为0
{
if(abs(*data)%2!=0   &&   *data!=0)
*data=*data-1;   //保证原位图信息取模后为0
else   if(*data==0)  
*data=*data;   //不变
}
else   //为1
{
if(*data%2!=1   &&   *data!=0)
*data=*data-1;   //保证原位图信息取模后为1
else   if(*data==0)
*data=*data+1;   //对原数据为0   的处理,保证原位图信息取模后为1
}
data=data+1;
}
++pl;
}

/////////////////////////////////////////////
data=pbmfh+0x019A;
while(length!=0)   //嵌入信息过程
{
for(i=0;i <8;i++)
{
if((tempbuffer=(*buffer)&OpAND[i])==0)   //为0
{
if(abs(*data)%2!=0   &&   *data!=0)
*data=*data-1;   //保证原位图信息取模后为0
else   if(*data==0)  
*data=*data;   //不变
}
else   //为1
{
if(*data%2!=1   &&   *data!=0)
*data=*data-1;   //保证原位图信息取模后为1
else   if(*data==0)
*data=*data+1;   //对原数据为0   的处理,保证原位图信息取模后为1
}
data=data+1;