Расчет CRC - по крупицам - C ++ - PullRequest
0 голосов
/ 07 июня 2018

Мне нужно создать программу, которая рассчитывает CRC из файла.Это должно быть сделано постепенно.

Способ, которым я хотел бы прочитать файл:

unsigned char byte;
ifstream file;
bool result;
int number;

file.open("test.txt", ios::binary);

while(true)
{
    byte = file.get();
    number = (int)byte;

    result = file.good();
    if(!result) 
    break;  
}

Однако я не знаю, как читать его по крупицам.

Мой делитель CRC (называемый «полином») равен 0x04C11DB7, и мне нужно импортировать 1 новый бит из файла каждый раз, когда я вычисляю свой буфер.

Моя идея состоит в том, чтобы добавить первые 4 байта в переменную (скажем, «1234» это будет 0x31323334), затем удалить последний бит (перемещая бит 1 влево), но я незнать, как добавить новый бит из следующего символа.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Делитель - это не просто , называемый полиномом.Это означает, что каждый бит является коэффициентом полинома (степени 32) и, таким образом, способ вычисления с помощью полинома значительно отличается от работы с целыми числами.Вы можете добавить (и вычесть, что в данном случае одно и то же) два полинома с помощью простой операции XOR.Умножение / деление на / на X означает смещение.Справа или слева зависит от того, в каком порядке записаны коэффициенты полиномов.Это важно знать, потому что оба направления (слева направо и справа налево) действительно существуют.В случае 0x04C11DB7 коэффициент X ^ 0 равен биту 0, а коэффициент X ^ 31 равен биту 31. Имейте в виду, что популярная реализация CRC IEEE802.3 имеет противоположный битовый порядок.Таким образом, простое копирование реализации Ethernet CRC не будет работать.

Это означает, что следующий бит для обработки всегда будет бит 31. Поэтому вы должны проверить для 0x80000000.Если бит установлен, XOR ваш полином.Это означает, что вы вычитаете полином из вашего рабочего регистра.В любом случае сдвиньте результат влево впоследствии.Затем бит 0 сдвигается справа.Замените его следующим битом для обработки бинарной операцией or (| в C ++).Этот бит получается таким же образом: если вы читаете побайтно, ваш следующий бит будет 1 или 0, в зависимости от того, установлен ли 0x80 на вашем входе.Затем сдвиньте свой ввод влево.

0 голосов
/ 07 июня 2018

Вы имеете в виду что-то подобное?Расчет CRC может отличаться, но основное внимание здесь уделяется получению содержимого файла «по крупицам».

#include <iostream>
#include <fstream>

int main(int argc, char* argv[])
{
    unsigned char next;
    unsigned long crc = 0;
    if (argc < 2)
        return -1;
    std::fstream fs(argv[1], std::fstream::in);
    while (!fs.bad() && !fs.eof())
    {
        fs >> next;
        for (int i = 0; i < 8; i++)
        {
            crc += next & 1;
            next >>= 1;
        }
    }
    std::cout << "CRC " << crc << std::endl;
    return 0;
}
...