algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Cykliczna Kontrola Nadmiarowa - Implementacja w C/C++
Ocena użytkownikóww: *****  / 19
SłabyŚwietny
Nadesłany przez Michał Knasiecki, 28 lipca 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

crc32.cpp:
//Michal Knasiecki
//www.algorytm.org

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

//Wielomian dla CRC-32 zgodny ze standardem Ethernet, ZIP i RAR
#define P 0x04c11db7


unsigned long tablica[256];

//Funkcja zamienia miejscami bity starsze z mlodszymi
unsigned long Zamien_bity(unsigned long liczba, char l_bitow)
{
unsigned long wynik=0;
for(int i = 1; i < (l_bitow + 1); i++)
{
if(liczba & 1)
wynik |= 1 << (l_bitow - i);
liczba >>= 1;
}
return wynik;
}

//Wypelnia tablice odpowiednimi wartosciami
void Inicjuj_tablice(void){
//Dla kazdego znaku ASCII
for (int ASCII=0;ASCII<256;ASCII++)
{
tablica[ASCII]=Zamien_bity(ASCII, 8) << 24; 
for (int j = 0; j < 8; j++)
{
if ((tablica[ASCII] & (1 << 31))!=0)
 tablica[ASCII] = (tablica[ASCII] << 1) ^P; else
tablica[ASCII] = (tablica[ASCII] << 1);
}
tablica[ASCII] = Zamien_bity(tablica[ASCII], 32);
}
return;
}

void Oblicz_CRC(char *txt){
//Wartosc poczatkowa to (2^32)-1
unsigned long  crc32=0xffffffff;

int  wynik;
char kod[20];

//Liczba bajtow do przetworzenia
int dlugosc;

//Tekst, dla ktorego obliczymy crc32
unsigned char* tekst;
//------------------------------------------------------------

//Przykladowy tekst
tekst=(unsigned char*)txt;
dlugosc = strlen(tekst);

//Obliczaj crc przesuwajac kolejne znaki tekstu wejsciowego
while(dlugosc--)
	crc32=(crc32>>8)^tablica[(crc32&255)^*tekst++];
//Wykonaj operacje XOR z wartoscia poczatkowa
wynik=crc32^0xffffffff;

//Zamien wynik na hex
itoa(wynik,kod,16);
printf("Tekst wejsciowy: %s\n",txt);
printf("Suma CRC32: %s\n",kod);
printf("Dowolny klawisz...");


return;
}

void main(void){
//Funkcja tworzy tablice kodow dla wszystkich znakow ASCII
Inicjuj_tablice();

Oblicz_CRC("algorytmy i struktury danych");
getch();
return;
}
Dodaj komentarz