将 CRC C 算法移植到 C#
Porting a CRC C algorithm to C#
我在 C 中有这个函数,我需要移植到 C#。我做了几次尝试,但无法弄清楚我做错了什么。
多项式为0x04C11DB7uL。
它不必包含 while 循环,我也尝试过使用 For 循环。
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;
}
这是我的尝试:
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;
}
我的主要疑惑是我的 C# 函数中的 u32Word 赋值和循环条件,对吗?
我的测试设置是 58 个数组(块),每个块 1024 个字节。
但是这两个函数的输出是不一样的。那么是我的功能错误还是其他原因?
您只需在移动数据块的下一个值时更改行:
private uint CalculateBlockCheckSum(uint u32Sum, byte[] blockImage)
{
uint u32Word;
ulong u64Sum = u32Sum;
ulong comparisonValue = 0x100000000;
int count = blockImage.Length / sizeof(uint);
int i = 0;
while (count-- > 0)
{
u32Word = BitConverter.ToUInt32(blockImage,i*sizeof(uint));
u64Sum ^= u32Word;
for (byte iCounter = 0; iCounter < (8 * 4); ++iCounter)
{
u64Sum <<= 1;
if ((u64Sum & comparisonValue) != 0)
{
u64Sum ^= 0x04C11DB7uL;
}
}
i++;
}
return (uint)u64Sum;
}
我在 C 中有这个函数,我需要移植到 C#。我做了几次尝试,但无法弄清楚我做错了什么。
多项式为0x04C11DB7uL。
它不必包含 while 循环,我也尝试过使用 For 循环。
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;
}
这是我的尝试:
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;
}
我的主要疑惑是我的 C# 函数中的 u32Word 赋值和循环条件,对吗?
我的测试设置是 58 个数组(块),每个块 1024 个字节。 但是这两个函数的输出是不一样的。那么是我的功能错误还是其他原因?
您只需在移动数据块的下一个值时更改行:
private uint CalculateBlockCheckSum(uint u32Sum, byte[] blockImage)
{
uint u32Word;
ulong u64Sum = u32Sum;
ulong comparisonValue = 0x100000000;
int count = blockImage.Length / sizeof(uint);
int i = 0;
while (count-- > 0)
{
u32Word = BitConverter.ToUInt32(blockImage,i*sizeof(uint));
u64Sum ^= u32Word;
for (byte iCounter = 0; iCounter < (8 * 4); ++iCounter)
{
u64Sum <<= 1;
if ((u64Sum & comparisonValue) != 0)
{
u64Sum ^= 0x04C11DB7uL;
}
}
i++;
}
return (uint)u64Sum;
}