将CRC算法移植到C#
我在C中有一个函数,需要移植到C。我做了几次尝试,但不知道我做错了什么 多项式为0x04C11DB7uL 它不必包含while循环,我还尝试了For循环将CRC算法移植到C#,c#,c,crc,C#,C,Crc,我在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;
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;
}
静态uint32应用程序CalcCRC32(uint32求和、uint8数据、uint32计数)
{
uint8_t i计数器;
uint32_t u32字;
uint64_t u64Sum;
u64Sum=u32Sum;
count=count/4;//字节数-->字数
//符合AN4187的算法(图2)
而(计数--)
{
u32Word=*((uint32_t*)pData)+;
u64Sum^=u32字;
对于(i计数器=0;i计数器<(8*4);++i计数器)
{
u64Sum在移动数据块的下一个值时,只需更改行:
private uint CalculateBlockCheckSum(uint u32Sum,字节[]blockImage)
{
uint U32字;
ulong u64Sum=u32Sum;
ulong comparisonValue=0x100000000;
int count=blockImage.Length/sizeof(uint);
int i=0;
同时(计数-->0)
{
u32Word=BitConverter.ToUInt32(blockImage,i*sizeof(uint));
u64Sum^=u32字;
对于(字节iCounter=0;iCounter<(8*4);++iCounter)
{
u64Sum请您提供一些测试示例好吗?只看一个规范并重新实现它而不看C代码不是更容易吗?我可能错了,但是C中的while(count--)
应该是while(count-->0)
而不是while(count-->=0)
C代码行u32Word=*((uint32_t*)pData)++
将uint8*pData
重新解释为uint32*de>count
是4的倍数。@Cid您在这一点上完全正确。使用equals会导致异常。如果我删除while循环条件下的equal比较,效果会非常好!标记为Accepted我可以自由编辑答案来修复上面OP提到的while(count-->0)
。
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;
}