?? zmd5.cpp
字號(hào):
//位塊數(shù)組
unsigned char x[64]={0};
//循環(huán),將原始信息以64字節(jié)為一組拆分進(jìn)行處理
for(int i=0,Index=-1;i<InputMessage.length();i++)
{
x[++Index]=InputMessage[i];
if(Index==63)
{
Index=-1;
Transform(x);
}
}
return ToHex(UpperCase);
}
/************************************************************************
對(duì)文件做MD5運(yùn)算的道理和對(duì)字符串的道理一樣,只不過數(shù)據(jù)來(lái)源于磁盤文件而已
記事:以為自己對(duì)文件操作很熟悉,不小心把"rb"寫成"wb",唉,后果可想而知!
************************************************************************/
string ZMD5::GetMD5OfFile(const string FileName,bool UpperCase)
{
//定義讀取文件的緩沖區(qū)
char* ReadBuf =new char[FILE_BUFFER_READ+1];
memset(ReadBuf,0,FILE_BUFFER_READ);
try
{
//檢查文件是否存在
if((_access(FileName.c_str(),0 )) == -1) return "";
//二進(jìn)制方式讀取文件
if(m_pFile=fopen(FileName.c_str(),"rb"),m_pFile==NULL) return "";
m_FileOpen=true;
//獲取文件大小
unsigned long FileSize=0xFFFF;
WIN32_FIND_DATA win32_find_data;
HANDLE hFile;
if((hFile=FindFirstFile(FileName.c_str(),&win32_find_data))!=INVALID_HANDLE_VALUE)
if(hFile==NULL) return "";
if(FileSize=win32_find_data.nFileSizeLow,FileSize==0xFFFF || FileSize==0) return "";
FindClose(hFile);
//初始化MD5所需常量
Init();
//通過文件長(zhǎng)度計(jì)算追加長(zhǎng)度
Append(FileSize);
//位塊數(shù)組
unsigned char x[64]={0};
//本次讀取字節(jié)數(shù)
int ReadSize=fread(ReadBuf,1,FILE_BUFFER_READ,m_pFile);
//讀取次數(shù)
int ReadCount=0;
while(ReadSize==FILE_BUFFER_READ)
{
/*
如果用戶開啟了另一個(gè)線程調(diào)用此函數(shù),則允許用戶從外部結(jié)
束此函數(shù),為安全起見,沒有在這個(gè)類的內(nèi)部開啟線程,可以最
大限度的保正了文件安全關(guān)閉
*/
if(!m_FileOpen)
{
fclose(m_pFile);
return "";
}
//將處理進(jìn)度返回給用戶
ReadCount++;
OnProcessing((int)(FILE_BUFFER_READ * ReadCount / (FileSize / 100)));
//將原始信息以64字節(jié)為一組拆分進(jìn)行處理
for(int i=0,Index=-1;i<FILE_BUFFER_READ;i++)
{
x[++Index]=ReadBuf[i];
if(Index==63)
{
Index=-1;
Transform(x);
}
}
memset(ReadBuf,0,FILE_BUFFER_READ); // 重置緩沖區(qū)
ReadSize=fread(ReadBuf,1,FILE_BUFFER_READ,m_pFile);
} // end while
/*
處理不能被整除的剩余部分?jǐn)?shù)據(jù),此時(shí)要對(duì)剩
余部分?jǐn)?shù)據(jù)進(jìn)行補(bǔ)位及長(zhǎng)原始信息長(zhǎng)度追加
*/
/*
如果最后一次讀取數(shù)據(jù)的長(zhǎng)度為零,說明文件已被讀完,
則直接將補(bǔ)位數(shù)據(jù)及原信息長(zhǎng)度送入Transform處理
*/
if(ReadSize==0)
{
string strData;
for(int i=0;i<m_AppendByte;i++)
{
if(i==0) strData+=(unsigned char)0x80;
else strData+=(unsigned char)0x0;
}
for(int i=0;i<8;i++) strData+=m_MsgLen[i];
for(int i=0,Index=-1;i<strData.length();i++)
{
x[++Index]=strData[i];
if(Index==63)
{
Index=-1;
Transform(x);
}
}
}
else // 將剩余數(shù)據(jù)處理完再補(bǔ)位
{
for(int i=0,Index=-1;i<ReadSize+m_AppendByte+8;i++)
{
//將原始信息以64字節(jié)為一組,進(jìn)行拆分處理
if(i<ReadSize)
x[++Index]=ReadBuf[i];
else if(i==ReadSize)
x[++Index]=(unsigned char)0x80;
else if(i<ReadSize+m_AppendByte)
x[++Index]=(unsigned char)0x0;
else if(i==ReadSize+m_AppendByte)
x[++Index]=m_MsgLen[0];
else if(i==ReadSize+m_AppendByte+1)
x[++Index]=m_MsgLen[1];
else if(i==ReadSize+m_AppendByte+2)
x[++Index]=m_MsgLen[2];
else if(i==ReadSize+m_AppendByte+3)
x[++Index]=m_MsgLen[3];
else if(i==ReadSize+m_AppendByte+4)
x[++Index]=m_MsgLen[4];
else if(i==ReadSize+m_AppendByte+5)
x[++Index]=m_MsgLen[5];
else if(i==ReadSize+m_AppendByte+6)
x[++Index]=m_MsgLen[6];
else if(i==ReadSize+m_AppendByte+7)
x[++Index]=m_MsgLen[7];
if(Index==63)
{
Index=-1;
Transform(x);
}
}
}
OnProcessing(100); //處理進(jìn)度百分之百
fclose(m_pFile); //關(guān)閉文件
m_FileOpen=false; //文件打開狀態(tài)為false
delete[] ReadBuf; //釋放動(dòng)態(tài)申請(qǐng)的內(nèi)存
}
catch(...)
{
if(m_FileOpen)
fclose(m_pFile); //關(guān)閉文件
m_FileOpen=false; //文件打開狀態(tài)為false
delete[] ReadBuf; //釋放動(dòng)態(tài)申請(qǐng)的內(nèi)存
return "";
}
return ToHex(UpperCase);
}
void ZMD5::GetMD5OfFile_Terminate()
{
if(m_FileOpen) m_FileOpen=false;
}
// VS60.iso
// 715,898,880 = 2AAB,C000
// 715,898,880 x 8 = 5727191040 = 1555E0000
// 740ec84eab66bb81b4c8175f34991df5
//
// 00000000,00000000,00000000,00000001_,_01010101,01011110,00000000,00000000 = 1555E 0000
// 00000000,00000000,00000000,00000001_,_01010101,01011000,00000000,00000000
// 00000000,00000000,00000000,00000000_,_00000000,00000110,0000000,000000000
// -------------------------------------------------------------------------
// |0000005E
//
// 2AAB = 0010101010101011
// C000 = 1100000000000000
// 2AAB x 8 = 00000000,00000001,01010101,01011000 = 00,00,00,00,00,01,55,58 (hex)
// C000 x 8 = 00000000,00000110,00000000,00000000 = 00,00,00,00,00,06,00,00 (hex)
//
// 01010101=55
// 01011110=5E
// 0x58 | 0x06 = 5E
//
// 00
// 00
// 5e
// 55
//
// 01
// 00
// 00
// 00
//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// MSDN_OCT_2001.iso
// 1,561,942,016 == 5D19,5800
// 1,561,942,016 x 8 = 2,E8CA,C000
// 578af06e1670e020a9e4694f36136f85
//
// 00000000,00000000,00000000,00000010_,_11101000,11001010,11000000,00000000 = 2,E8CA,C000
// 10_,_11101000,11001000
// 10,11000000,00000000
//
// 5D19 = 101110100011001
// 5800 = 101100000000000
// 5D19 x 8 = 101110100011001000 = 0002E8C8 (hex)
// 5800 x 8 = 101100000000000000 = 0002C000 (hex)
//
// 11001010=CA
// 11000000=C0
// 11101000=E8
//
// 0xC8 | 0x2 = 0xCA
//
// 00
// c0
// ca
// e8
//
// 02
// 00
// 00
// 00
//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
//
//
// // 512 M 的文件
// m_MsgLen[0]= 0x0;
// m_MsgLen[1]= 0x0;
// m_MsgLen[2]= 0x0;
// m_MsgLen[3]= 0x0;
// m_MsgLen[4]= 0x01;
// m_MsgLen[5]= 0x0;
// m_MsgLen[6]= 0x0;
// m_MsgLen[7]= 0x0;
//
// // VS60.iso
// m_MsgLen[0]= 0x00;
// m_MsgLen[1]= 0x00;
// m_MsgLen[2]= 0x5e;
// m_MsgLen[3]= 0x55;
// m_MsgLen[4]= 0x01;
// m_MsgLen[5]= 0x00;
// m_MsgLen[6]= 0x00;
// m_MsgLen[7]= 0x00;
//
// // MSDN_OCT_2001.iso
// m_MsgLen[0]= 0x00;
// m_MsgLen[1]= 0xc0;
// m_MsgLen[2]= 0xca;
// m_MsgLen[3]= 0xe8;
// m_MsgLen[4]= 0x02;
// m_MsgLen[5]= 0x00;
// m_MsgLen[6]= 0x00;
// m_MsgLen[7]= 0x00;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -