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

Suma kontrolna CRC-32

Ostatnio zmodyfikowano 2017-06-17 18:30
Autor Wiadomość
1551
Temat założony przez niniejszego użytkownika
» 2017-06-15 17:14:35
Mógłby mi ktoś wyjaśnić te zapisy?

@EDIT
Nadal potrzebuję jasnego wyjaśnienia, bo nie wszystko jest zrozumiałe.
P-162578
pekfos
» 2017-06-17 02:36:19
Może jakbyś zadał jakieś jasne i konkretne pytanie, a nie "mam już kod, proszę mi opisać jak działa" i też nie jakiś bełkot o wylizywaniu..
Np. Tworzenie tablicy z kodami ASCII, po co tam s ale przesunięcia bitowe oraz w samej funkcji CRCw jaki sposób jest to wylizane ?
P-162622
1551
Temat założony przez niniejszego użytkownika
» 2017-06-17 14:11:49
C/C++
unsigned long change_bits( unsigned long value, char l_bits )
{
    unsigned long result = 0;
    for( int i = 1; i <( l_bits + 1 ); i++ )
    {
        if( value & 1 )
             result |= 1 <<( l_bits - i );
       
        value >>= 1;
    }
    return result;
}
Co tutaj oznaczają linijki
result |= 1 <<( l_bits - i );
 - nadpisuje wartość result przez
result | 1 <<( l_bits - i );
 , ale nie wiem do końca jak działa zapis
1 <<( l_bits - i );
.

C/C++
void newarray() {
    for( int i = 0; i < 256; i++ )
    {
        arr[ i ] = change_bits( i, 8 ) << 24;
        for( int j = 0; j < 8; j++ )
        {
            if(( arr[ i ] &( 1 << 31 ) ) != 0 )
                 arr[ i ] =( arr[ i ] << 1 ) ^ P; else
            arr[ i ] =( arr[ i ] << 1 );
        }
        arr[ i ] = change_bits( arr[ i ], 32 );
    }
    return;
}
Tutaj domyślam się, że tworzy tablicę używaną później do liczenia CRC, ale nie rozumiem do końca zapisów
arr[ i ] = change_bits( i, 8 ) << 24;
 oraz
C/C++
if(( arr[ i ] &( 1 << 31 ) ) != 0 )
     arr[ i ] =( arr[ i ] << 1 ) ^ P; else
arr[ i ] =( arr[ i ] << 1 );

Dlaczego tutaj używamy zamiany bitów starszych z młodszymi ?

C/C++
unsigned int CRC( string txt ) {
    unsigned long crc32 = 0xffffffff;
   
    unsigned int result;
    char code[ 20 ]; //czemu akurat rozmiar 20
   
    //Liczba bajtow do przetworzenia
    int length;
   
    const char * text = txt.c_str();
   
   
    length = strlen( text );
   
    while( length-- ) //tutaj po prostu działa, aż skończą się znaki, tak ?
         crc32 =( crc32 >> 8 ) ^ arr[( crc32 & 255 ) ^* text++ ]; //tego zapisu nie rozumiem - nie wiem jak dokładnie on działa jest dosyć skomplikowany
   
    result = crc32 ^ 0xffffffff; //czemu wykonujemy to działanie ? wynikiem nie powinno byc nasze crc32 ?
   
    //Wynik w hex
    string ret = itoa( result, code, 16 );
    cout << "\n\n\n Tekst wejsciowy: " << txt;
    cout << "\n Suma CRC32: " << code;
    cout << "\n DEC : " << result;
   
    return result;
}
   
    Tutaj w komentarzach zadałem pytania, aby klarowniej przedstawić czego nie rozumiem.
"Wylizanie" w poprzednim poście to była najzwyklejsza literówka i nie ma potrzeby się złościć.
P-162623
pekfos
» 2017-06-17 16:44:25
Zacznijmy od tego, że zadanie jest zrobione nie na temat..
Nie mogę również używać "sposobu tablicowego" - "do wyznaczenia CRC-32 należy wykorzystać podstawowy algorytm dzielenia ciągu danych (bajtów 8-bitowych) odczytywanych z zadanego pliku wejściowego przez wielomian generujący CRC bit po bicie."
Jeśli ten kod nie jest 'sposobem tablicowym', to nie wiem co jest. To nie jest algorytm, jaki miałeś zaimplementować, tylko jego zoptymalizowany odpowiednik.
https://www.quora.com​/What-is-an-intuitive-explanation-of-the-CRC-cyclic-redundancy-check-algorithm
Tu masz jakiś opis algorytmu, chociaż zaznaczyłeś wyraźnie na samym początku, że wiesz, co robisz (czy raczej, co masz zrobić).

Co do samego opisywania kodu:
  • Działanie operacji bitowych powinieneś znać. Bez takiej wiedzy wstępnej nie masz po co zabierać się za te zadanie.
  • Zmiana kolejności bitów wynika z tego, że kolejność bitów w dzieleniu jest umowna. To + reszta pytań o algorytm to cecha tej implementacji CRC.
  • Tablica ma rozmiar 20, bo tak się komuś napisało.

"Wylizanie" w poprzednim poście to była najzwyklejsza literówka i nie ma potrzeby się złościć.
Całe tamto zdanie to literówka. Jeśli nie możesz poświecić minuty na przeczytanie tego, co napisałeś, to nie masz podstaw oczekiwać, że ktokolwiek poświęci minutę na czytanie tego drugi raz, by zrozumieć o co ci właściwie chodzi.
P-162626
1551
Temat założony przez niniejszego użytkownika
» 2017-06-17 18:30:41
Miałem zamiar robić to bit po bicie, ale okazało się, że jest możliwość implementacji tablicowej lecz trzeba kod rozumieć. I tutaj jest problem. Spróbuję jakoś na spokojnie rozpisać te działania na kartce.
P-162628
1 2 3 « 4 »
Poprzednia strona Strona 4 z 4