Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] CRC - Sprawdzenie poprawności

Ostatnio zmodyfikowano 2021-01-24 12:47
Autor Wiadomość
ridic14
Temat założony przez niniejszego użytkownika
[C++] CRC - Sprawdzenie poprawności
» 2021-01-23 23:30:59
Cześć, siedzę już dłuższy czas nad pewnym problemem, chyba nie jestem w stanie znaleźć rozwiązania, a mianowicie poniżej zaprezentowany kod jest w stanie wyliczyć mi CRC o zadanym wielomianie dla pliku. Przy okazji korzystam z gotowej tablicy wartości dla danych kodów ASCII. Chciałbym po obliczeniu tej sumy, sprawdzić jej poprawność i tu mam dwa pytania. Wiadomo że sprawdzenie polega na tych samych czynnościach co liczenie tej sumy, jednak czy działa to również gdy mam gotową tablicę wartości dla ascii? (CRC jest liczony prawidłowo). Jak powinienem zmodyfikować warunki dla sprawdzania poprawności. Głowię się już dłuższą chwilę i jakoś nie mogę wpaść na trop.

C/C++
crc32 = 0xffffffff;

in->read(( char * ) buf, sizeof( buf ) );
n = in->gcount();
while( n > 0 ) {
   
for( i = 0; i < n; i++ )
       
 crc32 =( crc32 >> 8 ) ^ crcValuesArray[( crc32 & 0xff ) ^ buf[ i ] ];
   
   
in->read(( char * ) buf, sizeof( buf ) );
   
n = in->gcount();
}

crc32 ^= 0xffffffff;

P-177994
pekfos
» 2021-01-24 12:47:24
Gotowa tablica CRC to optymalizacja, nie ma wpływu na działanie.

Jak powinienem zmodyfikować warunki dla sprawdzania poprawności.
Zawsze gdy masz sumę kontrolną, to możesz po prostu obliczyć ją drugi raz i sprawdzić czy nowa jest równa poprzedniej. W przypadku CRC, obliczenia mają swoje matematyczne znaczenie. Dane wejściowe to wielomian w GF(2), gdzie każdy bit danych jest współczynnikiem wyrazu xn dla jakiegoś n. Niech D(x) jest danymi a P(x) wielomianem generującym. CRC to reszta z dzielenia x32D(x) przez P(x). Jeśli dodasz CRC na koniec danych i przy sprawdzaniu policzysz resztę z dzielenia przez x32D(x)+CRC(x), to dla poprawnej sumy kontrolnej wynik wynosi 0.
P-177998
« 1 »
  Strona 1 z 1