I have this function in C that I need to port to C#. I've made a few attempts but can't figure out what I'm doing wrong.
The polynomial is 0x04C11DB7uL.
It doesn't have to include a while loop, i've also attempted with a For loop.
static uint32_t APPL_CalcCRC32(uint32_t u32Sum, uint8_t *pData, uint32_t count)
{
uint8_t iCounter;
uint32_t u32Word;
uint64_t u64Sum;
u64Sum = u32Sum;
count = count / 4; // number of bytes --> number of words
// algorithm according to AN4187 (Figure 2)
while (count--)
{
u32Word = *((uint32_t*)pData)++;
u64Sum ^= u32Word;
for (iCounter = 0; iCounter < (8 * 4); ++iCounter)
{
u64Sum <<= 1;
if (u64Sum & 0x100000000)
{
u64Sum ^= 0x04C11DB7uL;
}
}
}
return (uint32_t)u64Sum;
}
This is my attempt:
private uint CalculateBlockCheckSum( uint u32Sum, byte[] blockImage )
{
uint u32Word;
ulong u64Sum = u32Sum;
ulong comparisonValue = 0x100000000;
int count = blockImage.Length / 4;
int i = 0;
while ( count-- >= 0 )
{
u32Word = blockImage[i++];
u64Sum ^= u32Word;
for ( byte iCounter = 0; iCounter < ( 8 * 4 ); ++iCounter )
{
u64Sum <<= 1;
if ( ( u64Sum & comparisonValue ) != 0 )
{
u64Sum ^= 0x04C11DB7uL;
}
}
}
return (uint)u64Sum;
}
My main doubts are the u32Word assignment in my C# function and the loop criteria, are those right?
My test setup are 58 arrays (blocks) with each block 1024 bytes each. But the output of both functions is not the same. So is my function wrong or it is something else?