Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdlib>
- #include <string>
- #include <iostream>
- #include <fstream>
- #define polynomial 0x04c11db7
- using namespace std;
- long generator_crc(unsigned char sign, long buffor){
- long if_buffor_full = 0; // zmienna potrzebna do buffora, bo buffor ma rozmiar 32 bity
- long temp = 0; // zmienna która przechowa nasz znak w postaci int
- // dzielimy nasz znak na 8 bitów. bo znaki ASCII są zapisywane na 255 czyli 8 bitów
- for(int i=7; i>=0; i--){
- if_buffor_full = buffor&0x80000000; // sprawdzamy czy nie przepełniliśmy buffora. 0x80000000: czyli 1 na ostatnim bicie. Czyli robimy Buffor AND 0x80000000. Jak cos to pytaj.
- temp = int(sign); //zamieniamy nasz znak z char na int
- temp >>= i; // przesuwamy bity w prawo o I
- temp = temp&(0x1); // bierzemy pod uwage tylko najmłodszy bit. Ogólnie rozpisz sobie to na kartce to ogarniesz o co chodzi
- buffor <<= 1; // przesuwamy nasz buffor
- buffor |= temp; // dodajemy wartosc otrzymana ze znaku czyli 1 albo 0
- if(if_buffor_full == 0x80000000){
- buffor = buffor^polynomial; // jezeli buffor przekroczony to dzielimy przez nasz wielomian
- }
- }
- return buffor;
- }
- long div_by_polynomial(long buffor){
- long if_buffor_full = 0;
- //dopisujemy 32 zera i jezeli przekraczamy rozmiar buffora to dzielimy przez wielomian
- for(int i=0; i < 32; i++){
- if_buffor_full = buffor&0x80000000;
- buffor <<= 1;
- if(if_buffor_full == 0x80000000){
- buffor = buffor^polynomial;
- }
- }
- return buffor;
- }
- void save_file(unsigned long crc)
- {
- ofstream file("wynik.crc32");
- int sign;
- // tu wypisiwanie bitowe przesuwamy i patrzymy na ostatnie 8 bitow
- sign = crc>>24;
- sign = sign&(0x000000ff);
- file<< char(sign);
- sign = crc>>16;
- sign = sign&(0x000000ff);
- file<< char(sign);
- sign = crc>>8;
- sign = sign&(0x000000ff);
- file<< char(sign);
- sign = crc>>0;
- sign = sign&(0x000000ff);
- file<< char(sign) << endl;
- int temp;
- // wypisywanie dwójkowe
- for(int i=31; i>=0; i--)
- {
- temp = crc>>i;
- temp = temp&(0x1);
- file<<temp;
- }
- file<<endl;
- file<< hex << crc << endl;
- file<< dec << crc << endl;
- file.close();
- }
- int main(int argc, char *argv[]) {
- string file_name;
- if(argc < 2){
- cout << "Nie podano nazwy pliku." << endl;
- return -1;
- }else{
- file_name = argv[1];
- }
- ifstream file(file_name.c_str(), ios::binary);
- long buffor = 0;
- char sign;
- cout << "Pobieranie znakow oraz obliczanie crc." << endl;
- while(file.get(sign)){
- //pobieramy znak po znaku az do konca pliku i przekazujemy znak do funkcji
- buffor = generator_crc(sign, buffor);
- }
- file.close();
- cout << "Dodanie 32 bitow zero oraz dalsze obliczenia crc." << endl;
- long crc = div_by_polynomial(buffor);
- cout << "Zapisywanie pliku wynikowego." << endl;
- save_file(crc);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment