最後我都做到了。我發佈代碼,也許有人會發現它有用。我知道代碼不乾淨,我仍然在學習。它可以計算大於2^31字節的文件的SHA1。測試它在一個22GB的文件。在backgroundWorker中工作正常:)
#define SHA1_BUFFER_SIZE 65535
//input buffer
array<unsigned char,1>^ buf = gcnew array<unsigned char,1>(SHA1_BUFFER_SIZE);
pin_ptr<unsigned char> pointer = &buf[0];
//Open file in 64-bit mode
FILE *file = _fopeni64("some_large_file.txt","rb");
SHA1CryptoServiceProvider^ SHA1 = gcnew SHA1CryptoServiceProvider();
//Move pointer to End of File
_fseeki64(file,0,SEEK_END);
//Read pointer position (file size)
unsigned __int64 size = (__int64)_ftelli64(file);
// Move pointer to begining of file
_fseeki64(file,0,SEEK_SET);
__int64 i = 1; // counter
float wyn = 0; // help variable for progress Percentage (float)
__int64 conv = 0; // help variable for progress Percentage (int)
//output buffer
array<unsigned char,1>^ outputbuffer = gcnew array<unsigned char,1>(SHA1_BUFFER_SIZE);
while(1)
{
//Read SHA1_BUFFER_SIZE bytes to buffer
size_t bufLen = fread(pointer, 1, SHA1_BUFFER_SIZE, file);
if (bufLen == 0) //End of file
{
if (ferror(file)) //Error opening file
return;
break;
}
//buffer has the last block of bytes of the file
if (SHA1_BUFFER_SIZE*i >= size )
SHA1->TransformFinalBlock(buf,0,bufLen);
else
SHA1->TransformBlock(buf,0,bufLen,outputbuffer,0);
wyn = SHA1_BUFFER_SIZE*100; /* Getting */
wyn /= size; /* the */
wyn *= i; /* progress */
conv = wyn; /* Percentage */
ComputeSHA1->ReportProgress(conv);
\\Update our progressBar
i++;
} //End main loop
String^ sHash = "";
//Get the computed hash and convert to System::String
sHash = BitConverter::ToString(SHA1->Hash);
//Replace the '-' characters in hash to white spaces
sHash = sHash->Replace('-',' ');
//Removing whitespaces from hash
sHash = System::Text::RegularExpressions::Regex::Replace(sHash, "\\s+", System::String::Empty);
//Filling a textBox with the SHA1
ComputeSHA1->ReportProgress(0,sHash);
您可以鉤入流中,即將streamreader包裝在您自己的流類中,該流類可以計算讀取和報告的字節數? – Rup
這種報告進度的方法是我想要實現的。類似這樣的: 1.我們打開文件 2.我們讀取緩衝區中的X個字節 3.我們調用ComputeHash(緩衝區) 但是如何對其進行編碼?我的意思是ComputeHash(緩衝區)? – Darxis