GoralWMoro

CRC32

Jun 9th, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <string>
  3. #include <iostream>
  4. #include <fstream>
  5. #define polynomial 0x04c11db7
  6. using namespace std;
  7. long generator_crc(unsigned char sign, long buffor){
  8.     long if_buffor_full = 0; // zmienna potrzebna do buffora, bo buffor ma rozmiar 32 bity
  9.     long temp = 0; // zmienna która przechowa nasz znak w postaci int
  10.     // dzielimy nasz znak na 8 bitów. bo znaki ASCII są zapisywane na 255 czyli 8 bitów
  11.     for(int i=7; i>=0; i--){
  12.         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.
  13.         temp = int(sign); //zamieniamy nasz znak z char na int
  14.         temp >>= i; // przesuwamy bity w prawo o I
  15.         temp = temp&(0x1); // bierzemy pod uwage tylko najmłodszy bit. Ogólnie rozpisz sobie to na kartce to ogarniesz o co chodzi
  16.  
  17.         buffor <<= 1; // przesuwamy nasz buffor
  18.         buffor |= temp; // dodajemy wartosc otrzymana ze znaku czyli 1 albo 0
  19.  
  20.         if(if_buffor_full == 0x80000000){
  21.             buffor = buffor^polynomial; // jezeli buffor przekroczony to dzielimy przez nasz wielomian
  22.         }
  23.     }
  24.  
  25.     return buffor;
  26. }
  27.  
  28. long div_by_polynomial(long buffor){
  29.     long if_buffor_full = 0;
  30.     //dopisujemy 32 zera i jezeli przekraczamy rozmiar buffora to dzielimy przez wielomian
  31.     for(int i=0; i < 32; i++){
  32.         if_buffor_full = buffor&0x80000000;
  33.         buffor <<= 1;
  34.         if(if_buffor_full == 0x80000000){
  35.             buffor = buffor^polynomial;
  36.         }
  37.     }
  38.  
  39.     return buffor;
  40. }
  41.  
  42.  
  43. void save_file(unsigned long crc)
  44. {
  45.  
  46.     ofstream file("wynik.crc32");
  47.  
  48.     int sign;
  49.     // tu wypisiwanie bitowe przesuwamy i patrzymy na ostatnie 8 bitow
  50.     sign = crc>>24;
  51.     sign = sign&(0x000000ff);
  52.     file<< char(sign);
  53.  
  54.     sign = crc>>16;
  55.     sign = sign&(0x000000ff);
  56.     file<< char(sign);
  57.  
  58.     sign = crc>>8;
  59.     sign = sign&(0x000000ff);
  60.     file<< char(sign);
  61.  
  62.     sign = crc>>0;
  63.     sign = sign&(0x000000ff);
  64.     file<< char(sign) << endl;
  65.  
  66.     int temp;
  67.     // wypisywanie dwójkowe
  68.     for(int i=31; i>=0; i--)
  69.     {
  70.         temp = crc>>i;
  71.         temp = temp&(0x1);
  72.         file<<temp;
  73.     }
  74.     file<<endl;
  75.  
  76.     file<< hex << crc << endl;
  77.     file<< dec << crc << endl;
  78.  
  79.     file.close();
  80. }
  81.  
  82. int main(int argc, char *argv[]) {
  83.     string file_name;
  84.  
  85.     if(argc < 2){
  86.         cout << "Nie podano nazwy pliku." << endl;
  87.         return -1;
  88.     }else{
  89.         file_name = argv[1];
  90.     }
  91.  
  92.     ifstream file(file_name.c_str(), ios::binary);
  93.     long buffor = 0;
  94.     char sign;
  95.     cout << "Pobieranie znakow oraz obliczanie crc." << endl;
  96.     while(file.get(sign)){
  97.         //pobieramy znak po znaku az do konca pliku i przekazujemy znak do funkcji
  98.         buffor = generator_crc(sign, buffor);
  99.     }
  100.     file.close();
  101.     cout << "Dodanie 32 bitow zero oraz dalsze obliczenia crc." << endl;
  102.     long crc = div_by_polynomial(buffor);
  103.     cout << "Zapisywanie pliku wynikowego." << endl;
  104.     save_file(crc);
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment