将CRC算法移植到C#

将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;

我在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;
}
静态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;
        }