SHARE
TWEET

Untitled

a guest Jun 16th, 2019 58 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top