Advertisement
Guest User

Untitled

a guest
Jun 14th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.68 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "crc.h"
  4.  
  5.  
  6. int modPolynomial(char *nazwa_pliku_in, unsigned char reszta[], unsigned char wielomian[])
  7. {
  8. unsigned char bufor_wejscia[BUFSIZE], kolejka[SIZECRC+BUFSIZE];
  9. unsigned char maska=128, ostatni_bit, pierwszy_bit;
  10. int n;
  11. int licznik_bitow=0;
  12. int licznik_bajtow_in=0, licznik_buforu=0;
  13.  
  14. int i;
  15. for (i=0; i<SIZECRC; i++)
  16. reszta[i]=0;
  17.  
  18. for (i=0; i<SIZECRC+BUFSIZE; i++)
  19. kolejka[i]=0;
  20.  
  21. FILE *wskaznik_pliku_in=NULL;
  22. wskaznik_pliku_in=fopen(nazwa_pliku_in,"rb");
  23.  
  24. if (wskaznik_pliku_in == NULL)
  25. {
  26. printf("Nie mozna otworzyc pliku: %s \n", nazwa_pliku_in);
  27. exit(EXIT_FAILURE);
  28. }
  29.  
  30. while((n=fread(bufor_wejscia,sizeof(unsigned char),BUFSIZE,wskaznik_pliku_in)))
  31. {
  32. //printf("Return fread %d\n",n);
  33. for (i=0; i<n; i++)
  34. kolejka[SIZECRC+i]=bufor_wejscia[i];
  35. licznik_bitow=8*n;
  36. licznik_bajtow_in+=n;
  37.  
  38. while (licznik_bitow)
  39. {
  40. licznik_buforu=1+(licznik_bitow-1)/8;
  41. //printf("Liczba bitow %d. Licznik buforu %d. \n", licznik_bitow, licznik_buforu);
  42. pierwszy_bit=maska&kolejka[0];
  43.  
  44. for (i=0; i<SIZECRC+licznik_buforu; i++)
  45. {
  46. kolejka[i]=(kolejka[i]<<1);
  47. ostatni_bit=kolejka[i+1]>>7;
  48. kolejka[i]=kolejka[i]|ostatni_bit;
  49. //printf("Bajt %d kolejki po przesunieciu: %#x\n", i, kolejka[i]);
  50. }
  51. if (pierwszy_bit!=0) //jesli pierwszy bit jest jedynka
  52. for(i=0; i<SIZECRC; i++)
  53. {
  54. kolejka[i]=kolejka[i]^wielomian[i];
  55. //printf("Bajt %d kolejki po xorowaniu: %#x\n", i, kolejka[i]);
  56. }
  57. licznik_bitow--;
  58.  
  59. } // end while
  60. } // end while
  61.  
  62. //printf("Sukcesywne dopisywanie degreegen zer na koncu kolejki.\n");
  63. licznik_bitow=degreegen;
  64.  
  65. while (licznik_bitow>0)
  66. {
  67. //printf("Liczba bitow %d\n", licznik_bitow);
  68.  
  69. pierwszy_bit=maska&kolejka[0];
  70. //printf("Pierwszy bit %#x\n", pierwszy_bit);
  71. for (i=0; i<SIZECRC; i++)
  72. {
  73. kolejka[i]=(kolejka[i]<<1);
  74. ostatni_bit=kolejka[i+1]>>7;
  75. kolejka[i]=kolejka[i]|ostatni_bit;
  76. }
  77. //for(int i=0; i<SIZECRC+n; i++)
  78. // printf("Po przesunieciu bajt %d kolejki: %#x\n", i, kolejka[i]);
  79. //Zero na koncu jest dopisywane z definicji przesuniecia
  80. if (pierwszy_bit!=0) //jesli pierwszy bit jest jedynka
  81. for(i=0; i<SIZECRC; i++)
  82. {
  83. kolejka[i]=kolejka[i]^wielomian[i];
  84. //printf("Bajt %d kolejki po xorowaniu: %#x\n", i, kolejka[i]);
  85. }
  86. licznik_bitow--;
  87.  
  88. }// end while
  89.  
  90. for(i=0; i<SIZECRC; i++)
  91. reszta[i]=kolejka[i];
  92.  
  93. return licznik_bajtow_in;
  94.  
  95. }
  96.  
  97. unsigned char * calculateCrc(char *fileName)
  98. {
  99. unsigned char reszta[SIZECRC];
  100. unsigned char gen[SIZECRC]={0,0,0,11};
  101.  
  102. modPolynomial(fileName, reszta, gen);
  103.  
  104. int i=0;
  105. addCRC(fileName, reszta);
  106.  
  107. for(i=0; i<4; i++){
  108. printf("%d, ", reszta[i]);
  109. }
  110. }
  111.  
  112. void addCRC(char * fileName, unsigned char crc[]){
  113.  
  114. FILE * fp;
  115.  
  116. if((fp = fopen(fileName, "rb+")) == NULL)
  117. {
  118. perror("ERROR");
  119. exit(EXIT_FAILURE);
  120. }
  121.  
  122. int c;
  123. fseek (fp, 0, SEEK_END); //na koniec
  124. int i;
  125. for(i=0; i<SIZECRC; i++)
  126. {
  127. c = crc[i];
  128. fputc(c, fp);
  129. }
  130. if(fclose(fp) != 0)
  131. {
  132. perror("fclose");
  133. exit(EXIT_FAILURE);
  134. }
  135.  
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement