Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.97 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <math.h>
  4. #include <clocale>
  5.  
  6. int main()
  7. {
  8. setlocale(LC_CTYPE, "rus");
  9. FILE *q, *w, *f, *r; // Здесь q - Исходное изображение, f - Исходный текст, w - Зашифрованное изображение, r - расшифрованный текст
  10. int i, j, k, s = 0, count; // i, j, k, s - показатели счётчика
  11. long int size1, size2 = 0, size = 0;
  12.  
  13. printf("Введите для кодирования - 1, Введите для декодирования - 2: ");
  14. scanf("%d", &i);
  15. if (i == 1)
  16. {
  17. q = fopen("1.bmp", "rb"); // Открываем рисунок
  18. f = fopen("1.txt", "r"); // Открываем текстовый документ с текстом
  19. char e;
  20. while (!feof(f))
  21. {
  22. e = getc(f);
  23. size2++;
  24. }
  25. fclose(f);
  26. f = fopen("1.txt", "r");
  27. w = fopen("2.bmp", "wb");
  28. {
  29. fseek(q, 0, SEEK_END); //Перемещение указателя позиции в потоке в конец
  30. size1 = ftell(q); //Возвращает текущее значение указателя положения в файле для потока. Это значение представляет собой количество байт, на которое указатель отстоит от начала файла. Запоминает это значение в переменной.
  31. fseek(q, 0, SEEK_SET); //Перемещение указателя позиции в потоке в начало
  32. }
  33. count = size1;
  34. bool buf[8], sym[8];
  35. unsigned char pic, temp; // pic - символ исходного изображения, temp - символ для исходного текста
  36. for (i = 0; i < 54; i++) // Начинаем записывать файлы исходного изображения в новое, записываем первые 54 байта, содержащие заголовок файла (40 байт, содержащие идентификатор BMP- файла, его общий размер, а также зарезервированные поля) и заголовок растра (14 байт, содержащие основные характеристики изображения: ширину, высоту, цветовое разрешение, общий размер растровых данных, их положение относительно начала всего файла.)
  37. {
  38. pic = fgetc(q); //Cчитывание символов из потока и сохранение их в виде строки в параметр до тех пор пока не наступит конец строки или пока не будет достигнут конец файла.
  39. fputc(pic, w); //Записывание содержимого символа исходного изображения в заданный поток.
  40. count--;
  41. }
  42. bool ff[24]; //Число 24 здесь обозначает количество бит, у нас есть три цвета: Красный, синий, зелёный, где каждый цвет (пиксель) кодируется 8 битами. 8*3=24.
  43. for (i = 0; i < 24; i++)
  44. {
  45. ff[i] = size2 % 2; //Выделение отдельных битов числа size2 и запись их в массив. size2[0] соответствует младшему биту.
  46. size2 = size2 / 2; //Это эквивалентно побитовому сдвигу вправо, чтобы на следующем шаге получить очередной бит, который теперь стал младшим.
  47. }
  48. for (i = 0; i < 24; i++)
  49. {
  50. pic = fgetc(q); //Cчитывание символов из потока и сохранение их в виде строки в параметр до тех пор пока не наступит конец строки или пока не будет достигнут конец файла.
  51. for (j = 0; j < 8; j++)
  52. {
  53. buf[j] = (int)pic % 2;
  54. pic = (int)pic / 2;
  55. }
  56. buf[0] = ff[i];
  57. i++;
  58. buf[1] = ff[i];
  59. for (j = 0; j < 8; j++) //В одном байте 8 бит
  60. pic = pic + buf[j] * (1 << j);
  61. fputc(pic, w);
  62. count--;
  63. }
  64. while (!feof(f)) //Записываем текст в изображение
  65. {
  66. temp = fgetc(f);
  67. for (i = 0; i < 8; i++)
  68. {
  69. sym[i] = (int)temp % 2;
  70. temp = (int)temp / 2;
  71. }
  72. for (i = 0; i < 8;)
  73. {
  74. pic = fgetc(q);
  75. for (j = 0; j < 8; j++)
  76. {
  77. buf[j] = (int)pic % 2;
  78. pic = (int)pic / 2;
  79. }
  80. pic = 0;
  81. for (k = 0; k < 8; k++, i++)
  82. {
  83. buf[k] = sym[i];
  84. }
  85. for (j = 0; j < 8; j++)
  86. pic = pic + (int)buf[j] * pow(2.0, (int)j);
  87.  
  88. fputc(pic, w);
  89. count--;
  90. }
  91. s++;
  92. }
  93. while (count)
  94. {
  95. pic = fgetc(q);
  96. fputc(pic, w);
  97. count--;
  98. }
  99. fclose(q);
  100. fclose(f);
  101. fclose(w);
  102. }
  103. else
  104. {
  105. w = fopen("2.bmp", "rb"); // Закодированное изображение
  106. r = fopen("2.txt", "w"); // Расшифрованный текст
  107. bool buf[8], sym[8], ff[24];
  108. unsigned char pic, temp;
  109. for (i = 0; i < 54; i++)
  110. pic = fgetc(w);
  111. for (i = 0; i < 24; i++)
  112. {
  113. pic = fgetc(w);
  114. for (j = 0; j < 8; j++)
  115. {
  116. buf[j] = (int)pic % 2;
  117. pic = (int)pic / 2;
  118. }
  119. ff[i] = buf[0];
  120. i++;
  121. ff[i] = buf[1];
  122. }
  123. for (i = 0; i < 24; i++)
  124. size = size + (int)ff[i] * pow(2.0, i);
  125. for (k = 0; k < size - 1; k++)
  126. {
  127. temp = 0;
  128. for (j = 0; j < 8;)
  129. {
  130. pic = fgetc(w);
  131. for (i = 0; i < 8; i++)
  132. {
  133. buf[i] = (int)pic % 2;
  134. pic = (int)pic / 2;
  135. }
  136. for (s = 0; s < 8; s++, j++)
  137. {
  138. sym[j] = buf[s];
  139. if (buf[s] >= 8) break;
  140. }
  141. }
  142. for (j = 0; j < 8; j++)
  143. temp = temp + (int)sym[j] * pow(2.0, (int)j);
  144. fputc(temp, r);
  145. }
  146. fclose(w);
  147. fclose(r);
  148. }
  149. printf("Завершено.n");
  150. getch();
  151. return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement