Ĺadny brzuch
Mógłby mi ktoś powiedzieć coś więcej na temat sumy kontrolnej( co to dokładnie jest i jak liczyć w c++ )
Suma kontrolna służy do sprawdzania poprawności jakichś danych. Masz powiedzmy plik z danymi. Przechodzisz przez cały plik, robisz jakiegoś rodzaju sumowanie, i wynik zapisujesz na końcu. Przy odczycie robisz to samo i sprawdzasz, czy suma zgadza się z tą zapisaną pod koniec pliku. Jeśli się nie zgadza, to znaczy że dane zostały zmienione. Taka zmiana danych może nastąpić podczas przesyłania siecią, z powodu wad nośnika, lub po prostu ktoś w nich grzebał ;).
Najbardziej znanym rodzajem sumy kontrolnej jest CRC. Nigdy się nie zastanawiałem jak on działa, więc nie napiszę. Natomiast możesz poszukać sobie z użyciem google czegoś na temat sum kontrolnych i CRC.
http://en.wikipedia....edundancy_check - może być ciężkie do zrozumienia, ale zawsze już jakiś link :),
:lol:
Użytkownik Programist edytował ten post 23 kwiecień 2005, 17:44
Ja mam jakiś kawałek tekstu np. "dkfjbnkfd" i chciałbym to "przetłumaczyć" za pomocą takiego czegoś 32 bit checksum . W googlach szukałem takiego hasła ale nic nie znalazłem na temat. Może znacie jakiś link do programu albo przystępny opis algorytmu do przekodowania tego tekstu?
Szkoda tylko że niepodałeś tej sumy kontrolnej bo 32 bitowych sum kontrolnych może być tysiące :)
Ale ja nie mam nic poza tym. W zadaniu jest tylko, że mam podać 32 bit checksum dla jakiegoś losowego tekstu. No i chyba muszę napisac program który mi wyliczy ta sumę kontrolną dla losowego tekstu.
Algorytny CRC to rodzina nalezaca do algorytmow hashujacych. Zalezy od dokladnosci jaka potrzebujesz rozmiar CRC moze byc dowolny (najczesciej uzywa sie 32 bity - ale czasem potrzebna jest lepsza dokladnosc/niepowtarzalnosc - i tam sie uzywa algorytmow mocno hashujacych - np MD5).
Ponizej masz kodzik na liczenie CRC 32 bit - dziala ladnie, jest uzywany w pewnym projekcie.
#define rol(x,n) (((x)<<(n)) | ((x)>>(8*sizeof(x)-(n)))) DWORD CRC_Table[256]; class CRC_BUILDER { public: CRC_BUILDER() { DWORD loop, crc_val = 0xFADE2310; for( loop = 0; loop < 256; loop ++ ) { crc_val = rol( (loop+1)*crc_val, loop ); CRC_Table[loop] = crc_val; } } }; CRC_BUILDER ___crc_buildeg_static_object; DWORD CalcCRC( BYTE *data, DWORD data_size ) { DWORD CRC_value(1), loop; ASSERT_PTR(data); for( loop = 0; loop < data_size; loop ++ ) CRC_value += rol( (( CRC_value * CRC_Table[ data[loop] ] ) ^ CRC_Table[ 255 - data[loop] ] ), data[loop] ); return CRC_value; }
CRC wylicza funkcja CalcCRC, klasa CRC_BUILDER sluzy do autogeneracji tablicy hashujacej.
Pozdr.
st3tc
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Suma kontrolna służy do sprawdzania poprawności jakichś danych. Masz powiedzmy plik z danymi. Przechodzisz przez cały plik, robisz jakiegoś rodzaju sumowanie, i wynik zapisujesz na końcu. Przy odczycie robisz to samo i sprawdzasz, czy suma zgadza się z tą zapisaną pod koniec pliku. Jeśli się nie zgadza, to znaczy że dane zostały zmienione. Taka zmiana danych może nastąpić podczas przesyłania siecią, z powodu wad nośnika, lub po prostu ktoś w nich grzebał ;).
Najbardziej znanym rodzajem sumy kontrolnej jest CRC. Nigdy się nie zastanawiałem jak on działa, więc nie napiszę. Natomiast możesz poszukać sobie z użyciem google czegoś na temat sum kontrolnych i CRC.
http://en.wikipedia....edundancy_check - może być ciężkie do zrozumienia, ale zawsze już jakiś link :),
:lol:
Użytkownik Programist edytował ten post 23 kwiecień 2005, 17:44
Ja mam jakiś kawałek tekstu np. "dkfjbnkfd" i chciałbym to "przetłumaczyć" za pomocą takiego czegoś 32 bit checksum . W googlach szukałem takiego hasła ale nic nie znalazłem na temat. Może znacie jakiś link do programu albo przystępny opis algorytmu do przekodowania tego tekstu?
Szkoda tylko że niepodałeś tej sumy kontrolnej bo 32 bitowych sum kontrolnych może być tysiące :)
Ale ja nie mam nic poza tym. W zadaniu jest tylko, że mam podać 32 bit checksum dla jakiegoś losowego tekstu. No i chyba muszę napisac program który mi wyliczy ta sumę kontrolną dla losowego tekstu.
Algorytny CRC to rodzina nalezaca do algorytmow hashujacych. Zalezy od dokladnosci jaka potrzebujesz rozmiar CRC moze byc dowolny (najczesciej uzywa sie 32 bity - ale czasem potrzebna jest lepsza dokladnosc/niepowtarzalnosc - i tam sie uzywa algorytmow mocno hashujacych - np MD5).
Ponizej masz kodzik na liczenie CRC 32 bit - dziala ladnie, jest uzywany w pewnym projekcie.
#define rol(x,n) (((x)<<(n)) | ((x)>>(8*sizeof(x)-(n)))) DWORD CRC_Table[256]; class CRC_BUILDER { public: CRC_BUILDER() { DWORD loop, crc_val = 0xFADE2310; for( loop = 0; loop < 256; loop ++ ) { crc_val = rol( (loop+1)*crc_val, loop ); CRC_Table[loop] = crc_val; } } }; CRC_BUILDER ___crc_buildeg_static_object; DWORD CalcCRC( BYTE *data, DWORD data_size ) { DWORD CRC_value(1), loop; ASSERT_PTR(data); for( loop = 0; loop < data_size; loop ++ ) CRC_value += rol( (( CRC_value * CRC_Table[ data[loop] ] ) ^ CRC_Table[ 255 - data[loop] ] ), data[loop] ); return CRC_value; }
CRC wylicza funkcja CalcCRC, klasa CRC_BUILDER sluzy do autogeneracji tablicy hashujacej.
Pozdr.
st3tc