/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Søges: rutine til CRC32 checksumsberegning~
Fra : Topper


Dato : 11-04-01 11:33

Hej!

Er der nogen derude der ligger inde med en sådan rutine
ville jeg blive meget glad. Enten til java/delphi/visual basic eller
c/c++...

Mange tak!

mvh.

Torben
- fjern -nospam- fra email...



 
 
Jesper Boegholm (18-04-2001)
Kommentar
Fra : Jesper Boegholm


Dato : 18-04-01 14:53

Hej Topper

Jeg har lavet et program der kan gøre det. Øhhmm jeg har klippet koden ud
til til at beregne crc32 for en fil. Det er den samme algoritme som RAR, og
ZIP bruger, så du kan teste den færdige sum med disse programmer.

Her starter koden der er 3 funktioner:
calccrc(filnavn), kig i den, for at se sammenhængen, hvis du har spørgsmål
til det så skriv.
----------------------------------------------
// This function uses the crc32_table lookup table
// to generate a CRC for csData
int CCRCCheckDlg::Get_CRC(unsigned int CRC, unsigned char *Data, int size)

{ // Pass a text string to this function and it will return the CRC.

// Once the lookup table has been filled in by the two functions
above,
// this function creates all CRCs using only the lookup table.
// Note that CString is an MFC class.
// If you don't have MFC, use the function below instead.

// Be sure to use unsigned variables,
// because negative values introduce high bits
// where zero bits are required.

// Start out with all bits set high.
// ULONG ulCRC = 0; file://0xffffffff;
// unsigned char* buffer;

// Get the length.
// Save the text in the buffer.
// Perform the algorithm on each character
// in the string, using the lookup table values.
while(size--)
CRC = (CRC >> 8) ^ crc32_table[(CRC & 0xFF) ^ *Data++];
// Exclusive OR the result with the beginning value.
return CRC;
// return ulCRC;
}

unsigned long CCRCCheckDlg::calccrc(LPCTSTR Filnavn)
{
// TODO: Add your control notification handler code here
unsigned long finalcrc;
char tmp[200];
unsigned char Buffer[65000];
unsigned long BytesRead = 0;
unsigned long TotalBytesRead = 0;
unsigned long FileSize = 0;
FILE *TestFile;

m_FileProgress.SetPos(0);

Init_CRC32_Table();

if ( (TestFile = fopen(Filnavn, "rb")) == NULL)
{
// MessageBox("File could not be opened", NULL, MB_OK);
return(-1);
}
else
{

fseek(TestFile, 0, SEEK_END);
FileSize = ftell(TestFile);
fseek(TestFile, 0, SEEK_SET);

sprintf(tmp, "%s", Filnavn);
// m_ReadStatus = tmp;
UpdateData(false);
finalcrc = 0xffffffff;

while(!feof(TestFile))
{
BytesRead = fread(Buffer, sizeof(char), sizeof(Buffer), TestFile);
TotalBytesRead += BytesRead;
BytesDone += BytesRead;
file://finalcrc = update_crc(finalcrc, Buffer, BytesRead);
finalcrc = Get_CRC(finalcrc, Buffer, BytesRead);
m_FileProgress.SetPos((TotalBytesRead*100.0)/FileSize);
m_OverallProgress.SetPos((BytesDone*100.0)/BytesToSearch);

}

finalcrc ^= 0xffffffff;
fclose(TestFile);

// sprintf(tmp, "CRC = 0x%08X", finalcrc);
// m_CRC = tmp;
// UpdateData(false);
}

return(finalcrc);

}

// Call this function only once to initialize the CRC table.
void CCRCCheckDlg::Init_CRC32_Table()
{// Call this function only once to initialize the CRC table.

// This is the official polynomial used by CRC-32
// in PKZip, WinZip and Ethernet.
ULONG ulPolynomial = 0x04c11db7;

// 256 values representing ASCII character codes.
for(int i = 0; i <= 0xFF; i++)


crc32_table[i]=Reflect(i, 8) << 24;
for (int j = 0; j < 8; j++)
crc32_table[i] = (crc32_table[i] << 1) ^ (crc32_table[i] &
(1 << 31) ? ulPolynomial : 0);
crc32_table[i] = Reflect(crc32_table[i], 32);
}
}










"Topper" <tlp-nospam-@post6.tele.dk> wrote in message
news:9b1brk$c0r$1@news.inet.tele.dk...
> Hej!
>
> Er der nogen derude der ligger inde med en sådan rutine
> ville jeg blive meget glad. Enten til java/delphi/visual basic eller
> c/c++...
>
> Mange tak!
>
> mvh.
>
> Torben
> - fjern -nospam- fra email...
>
>



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste