| 
 | 
 
<  align=center>下面这段程序是什么编的并给出完整模式</P> 
 
< >for(DWORD i=54;i<BaseFileLen;i++) {  
 
Temp=((HideData[j]&224)>>5)<<5; </P> 
< >BaseData=HideCalculate(BaseData,Temp);  </P> 
<P>i++;    
 
Temp=((HideData[j]&28)>>2)<<5;  </P> 
<P>BaseData=HideCalculate(BaseData,Temp);  
 
i++;  
 
Temp=(HideData[j]&3)<<1;    
 
j++;  </P> 
<P>Temp|=(HideData[j]&128)>>7;  
 
Temp*=32;  
 
BaseData=HideCalculate(BaseData,Temp);  
 
i++;  
 
Temp=((HideData[j]&112)>>4)<<5;  </P> 
<P>BaseData=HideCalculate(BaseData,Temp);  
 
i++;  
 
Temp=((HideData[j]&14)>>1)<<5;  </P> 
<P>BaseData=HideCalculate(BaseData,Temp);  
 
i++;  
 
Temp=(HideData[j]&1)<<2;  
 
j++;  
 
Temp|=(HideData[j]&192)>>6;  
 
Temp*=32;  
 
BaseData=HideCalculate(BaseData,Temp);  
 
i++;  
 
Temp=((HideData[j]&56)>>3)<<5; //第七个“3比特” BaseData=HideCalculate(BaseData,Temp);  
 
i++;  
 
Temp=(HideData[j]&7)<<5; //第八个“3比特” BaseData=HideCalculate(BaseData,Temp);  
 
j++;  
 
}  
 
其中,图像融合计算是在unsigned char HideCalculate(unsigned char B, unsigned char H);函数中完成的。参数B为宿主信息的内容, H为隐藏信息的内容。计算完成后将融合后的信息返回,改函数的实现编码如下:  
 
unsigned char CDataHiderView::HideCalculate(unsigned char B, unsigned char H)  
 
{  
 
// f2=round(f0*(1-t))+round(f1*t)  
 
unsigned char R=(int)((1-t)*B+0.5f)+(int)(t*H+0.5f);  
 
return R;  
 
}  
 
文件从位图中提取的过程实际是文件隐藏的逆过程。将含有隐含文件的位图和原始位图读入缓存后,先通过信息提取从宿主信息的每个字节恢复出3个比特,然后将这些比特流按次序以8bit/byte的格式组成字节流,从而完成对隐藏信息的恢复:  
 
……  
 
for(DWORD i=54;i<CarrierFileLen;i++)  
 
{  
 
Temp=(ShowCalculate(CarrierData,BaseData)&7)<<5;//提取出第一个“3比特”  
 
i++; //宿主信息指针修正(字节为单位)  
 
Temp|=(ShowCalculate(CarrierData,BaseData)&7)<<2; //提取出第二个“3比特”  
 
i++;  
 
Temp|=(ShowCalculate(CarrierData,BaseData)&6)>>1; //提取出第三个“3比特”  
 
CarrierData[j]=Temp; //恢复出第一个隐藏字节  
 
j++; //隐藏信息指针修正(字节为单位)  
 
Temp=(ShowCalculate(CarrierData,BaseData)&1)<<7;  
 
i++;  
 
Temp|=(ShowCalculate(CarrierData,BaseData)&7)<<4; //提取出第四个“3比特”  
 
i++;  
 
Temp|=(ShowCalculate(CarrierData,BaseData)&7)<<1; //提取出第五个“3比特”  
 
i++;  
 
Temp|=(ShowCalculate(CarrierData,BaseData)&4)>>2; //提取出第六个“3比特”  
 
CarrierData[j]=Temp; //恢复出第二个隐藏字节  
 
j++;  
 
Temp=(ShowCalculate(CarrierData,BaseData)&3)<<6;  
 
i++;  
 
Temp|=(ShowCalculate(CarrierData,BaseData)&7)<<3; //提取出第七个“3比特”  
 
i++;  
 
Temp|=ShowCalculate(CarrierData,BaseData)&7; //提取出第八个“3比特”  
 
CarrierData[j]=Temp; //恢复出第三个隐藏字节  
 
j++;  
 
</P> |   
 
 
 
 |