Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 18.12.2023
Сообщений: 8

Стеганография. Как изменить младшие биты каждого байта пикселей изображения?

18.12.2023, 20:44. Показов 2319. Ответов 13

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <windows.h>
#include <string>
#include <bitset>
BITMAPFILEHEADER file_header;
BITMAPINFOHEADER bitmap_info;
int main()
{
    FILE* file = fopen("C:\\Users\\Meeller\\Desktop\\cbmp.bmp", "rb");
    if (file == NULL)
    {
        std::cout << "The file was opened unsuccessfully" << std::endl;
        return 0;
    }
    else
    {
        std::cout << "The file was opened successfully" << std::endl;
        fread(&file_header, sizeof(file_header), 1, file);
        fread(&bitmap_info, sizeof(bitmap_info), 1, file);
        printf("size of file_header: %d\n", sizeof(file_header));
        printf("size of bitmap_info: %d\n", sizeof(bitmap_info));
        printf("width: %d\n", bitmap_info.biWidth);
        printf("height: %d\n", bitmap_info.biHeight);
        printf("bit count: %d\n", bitmap_info.biBitCount);
        BYTE* bytes = (BYTE*)malloc(bitmap_info.biSizeImage);
        fseek(file, file_header.bfOffBits, SEEK_SET);
        fread(bytes, bitmap_info.biSizeImage, 1, file);
        printf("bytes: %d\n", bitmap_info.biSizeImage);
        if (bitmap_info.biSizeImage == (bitmap_info.biWidth * bitmap_info.biHeight * bitmap_info.biBitCount)/8)
        {
            std::cout << "The data was read successfully" << std::endl;
        }
        else
        {
            std::cout << "The data was read unsuccessfully" << std::endl;
        }
        free(bytes);
    }
    std::string message;
    std::cout << "Enter a message" << std::endl;
    getline(std::cin, message);
    int size = message.size();
    std::cout << size << std::endl;
    for (int i = 0; i < size; i++)
    {
        const char c = message[i];
        std::bitset<8> binary = std::bitset<8>(c);
        std::cout << binary<<std::endl;
        for (int j = 0; j < 8; j++)
        {
        }
    }
    fclose(file);
    return 0;
}
Имеется вот такая программа. Суть в том, что я не могу реализовать изменение младших битов каждого байта пикселей изображения. Т. е с консоли вводится сообщение и посимвольно помещается в 24-х разрядный несжатый рисунок bmp, например, символ представлен в двоичном виде как 11001100 и каждый бит этого символа должен быть заменен на младший бит первой восьмерки байтов, следующий символ второй восьмерки и т.д, пока не будет помещено все сообщение. Какую структуру встроенную использовать? Или как это в принципе реализовать? Потом это сообщение нужно считать из изображения и вывести на экран. Прошу помощи
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.12.2023, 20:44
Ответы с готовыми решениями:

Поменять попарно местами младшие и старшие полубайты каждого байта
Дана последовательность байт заканчивающаяся нулем. Поменять попарно местами младшие и старшие полубайты каждого байта, если значение...

Переставить биты в обратном порядке для каждого байта
Переставить биты в обратном порядке для каждого байта. Решите пожалуйста

Поменять местами биты младшего байта каждого числа
Ребята выручайте! Долгов набрал все не успеваю! Написать прогу пользуюсь Lazarus Заранее благодарен! Поменять местами биты младшего...

13
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.12.2023, 21:14
C++
1
2
3
4
5
6
7
8
9
10
11
12
    int k = 0;
    for (int i = 0; i < size; i++)
    {
        const char c = message[i];
        std::bitset<8> binary = std::bitset<8>(c);
        std::cout << binary<<std::endl;
        for (int j = 0; j < 8; j++)
        {
            bytes[k] = (bytes[k] & 0xFE) | binary[j];
            ++k;
        }
    }
0
0 / 0 / 0
Регистрация: 18.12.2023
Сообщений: 8
18.12.2023, 21:22  [ТС]
Необработанное исключение по адресу 0x00007FF7D0FC917C: 0xC0000005: нарушение прав доступа при чтении по адресу 0x000001DE09C95070.
Вот такую ошибку выдал, что не так?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.12.2023, 21:29
В какой строке? Ты размер массива проверял?
0
0 / 0 / 0
Регистрация: 18.12.2023
Сообщений: 8
18.12.2023, 21:32  [ТС]
Размер массива есть размер введенного сообщения. Указывает на эту строку: bytes[k] = (bytes[k] & 0xFE) | binary[j];
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.12.2023, 21:43
Размер массива, считанного из файла.
0
0 / 0 / 0
Регистрация: 18.12.2023
Сообщений: 8
18.12.2023, 21:47  [ТС]
Простите, а какого массива, считанного из файла?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.12.2023, 21:49
danya18, т. е. ты даже не сам это писал?
Строка 26.
0
0 / 0 / 0
Регистрация: 18.12.2023
Сообщений: 8
18.12.2023, 21:54  [ТС]
Интересно, по какому принципу вы это определили

Добавлено через 4 минуты
Ошибка все также осталась, вместо size теперь bitmap_info.biSizeImage
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.12.2023, 21:57
Цитата Сообщение от danya18 Посмотреть сообщение
по какому принципу
Ну если не знаешь, где массив.

Выведи на экран bitmap_info.biSizeImage. Какое там значение? Может вообще ноль.
0
0 / 0 / 0
Регистрация: 18.12.2023
Сообщений: 8
18.12.2023, 22:00  [ТС]
Для меня это не массив, считанный из файла, вот и все. Это значение и так выводится на экран(15552000 в bytes содержится)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.12.2023, 22:16
Ну а в 38-й что? Поставь перед fclose.
0
0 / 0 / 0
Регистрация: 18.12.2023
Сообщений: 8
18.12.2023, 22:50  [ТС]
Теперь он сообщает, что строка вне диапазона находится. Его не устраивает все та же строка, сообщает, что: переполнение буфера при записи в bytes, чтение недопустимых данных оттуда же и разыменование пустого указателя bytes. Предполагаю, что ошибка в итерации( считывать до size, а не до массива из файла). По крайней мере, изменив на size, отработал без ошибок и завершился с кодом 0

Добавлено через 20 минут
Дело в выделении памяти для bytes. При выводе его значения в консоль оно выводит каждый раз разное значение
0
 Аватар для Worldmaster
323 / 190 / 45
Регистрация: 25.08.2011
Сообщений: 1,263
19.12.2023, 09:07
danya18, Для кого существует режим отладки с пошаговым ходом??

И документация MSDN:

C++
1
2
stride = ((((biWidth * biBitCount) + 31) & ~31) >> 3);
biSizeImage = abs(biHeight) * stride;

Вот тут равенства вроде как не будет.
Цитата Сообщение от danya18 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
if (bitmap_info.biSizeImage == (bitmap_info.biWidth * bitmap_info.biHeight * bitmap_info.biBitCount)/8)
        {
            std::cout << "The data was read successfully" << std::endl;
        }
        else
        {
            std::cout << "The data was read unsuccessfully" << std::endl;
        }

Далее вы делаете освобождение памяти:

Цитата Сообщение от danya18 Посмотреть сообщение
free(bytes);
Ну и логично что код вылетит в ошибку:

Цитата Сообщение от nmcf Посмотреть сообщение
bytes[k] = (bytes[k] & 0xFE) | binary[j];
Память то чистая.

Цитата Сообщение от danya18 Посмотреть сообщение
Для меня это не массив, считанный из файла, вот и все.
А что это если не массив?
Может лучше оперировать общепринятыми терминами? Чтобы не было путаницы?

Добавлено через 23 минуты
Цитата Сообщение от danya18 Посмотреть сообщение
При выводе его значения в консоль оно выводит каждый раз разное значение
bytes содержит указатель на первый элемент в памяти. Естественно у него всегда будет разное значение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2023, 09:07
Помогаю со студенческими работами здесь

Как разбить бинарный файл на младшие и старшие биты
Сабж собственнно. Есть бинарный файл(.BIN) Весит он 1024 байта. Его каким-то образом разбивают(split) на два файла - 960(старшие...

... В четных байтах числа в двоичной системе переместить нулевые биты в старшие биты, а в нечетных байтах – в младшие ...
Доброго времени суток всем, столкнулся с проблемой по С++,требуется написать программу: которая получает 1)случайное целое типа int,...

Младшие и старшие биты
Допустим у меня есть число в 2й сист. 11011011 ,подскажите где здесь младшие биты а где старшие

Разделить старшие и младшие биты в переменной
Объясните дураку работу с битовыми операциями... Есть у меня массив, где первый элемент это 32 младших бита, а второй - 32 старших ...

MikroPascal for AVR - по "алиасам", биты одного байта(переменной) назначить на биты других байтов(портов, пинов)
В связи повальной кастрацией портов в Atmega328 (Arduino Uno) возникла необходимость каким-то образом присвоить биты одной переменной, к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru