Портирование CRC C алгоритма на C # - PullRequest
4 голосов
/ 06 ноября 2019

У меня есть эта функция в 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;
        }

Мои главные сомнения - это назначение u32Word в моей функции C # и критерии цикла, верно ли это?

Моя тестовая установка - это 58 массивов (блоков) с каждым блоком 1024байтов каждый. Но вывод обеих функций не одинаков. Так у меня неправильная функция или что-то еще?

1 Ответ

4 голосов
/ 06 ноября 2019

Вам нужно изменить строку только при переходе к следующему значению вашего блока данных:

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;
}
...