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

Не могу понять что не так с кодом (сжатие кодом Хэмминга)

07.05.2023, 23:02. Показов 1291. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написали код по заданию
"Считать картинку bmp по пикселям: R 8 бит, G 8 бит, B 8 бит. Старший бит в каждом байте
оставить без изменения . Каждый вектор длины 7 преобразовать в кодовое слово кода Хэмминга
(7,4,3). 2^7 -> 2^4(сжатие). Записать в файл для каждого байта –старший бит + 4 информационных
бита кодового слова кода Хэмминга. То есть каждые 8 бит исходного файла преобразуются в 5 бит
результирующего . Коэффициент сжатия = 5/8"
Вроде бы не коцаный bmp берем, но код не работает.

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
 
using namespace std;
 
// Функция для сжатия вектора длины 7 в код Хэмминга (7,4,3)
bitset<7> hamming_encode(const vector<char>& data) {
    bitset<7> result;
    result[2] = data[0];
    result[4] = data[1];
    result[5] = data[2];
    result[6] = data[3];
    result[0] = result[2] ^ result[4] ^ result[6] ^ data[4];
    result[1] = result[2] ^ result[5] ^ result[6] ^ data[5];
    result[3] = result[4] ^ result[5] ^ result[6] ^ data[6];
    return result;
}
 
int main() {
 
 
 
    setlocale(LC_ALL, "Russian");
    // Открыть BMP файл
    ifstream input_file("input.bmp", ios::binary);
    if (!input_file.is_open()) {
        cout << "Не удалось открыть файл\n";
        return 1;
    }
 
    // Считать заголовок файла
    char header[54];
    input_file.read(header, 54);
 
    // Вывод значений заголовка на экран
    for (int i = 0; i < 54; i++) {
        cout << "header[" << i << "] = " << (int)header[i] << endl;
    }
 
    // Получить ширину и высоту из заголовка
    int width = *(int*)&header[18];
    int height = *(int*)&header[22];
 
    // Вывод информации о заголовке BMP файла
    cout << "ID: " << header[0] << header[1] << endl;
    cout << "Size: " << *(int*)&header[2] << endl;
    cout << "Offset: " << *(int*)&header[10] << endl;
    cout << "Width: " << *(int*)&header[18] << endl;
    cout << "Height: " << *(int*)&header[22] << endl;
    cout << "Bits per pixel: " << *(short*)&header[28] << endl;
 
    // Проверить формат BMP файла
    if (*(int*)&header[0] != 0x4D42 || *(int*)&header[28] != 24) {
        cout << "Неподдерживаемый формат BMP файла\n";
        return 1;
    }
 
    // Создать выходной файл
    ofstream output_file("output.bin", ios::binary);
 
    // Считать пиксели и сжать каждый вектор длины 7 в код Хэмминга (7,4,3)
    for (int y = height - 1; y >= 0; y--) {
        for (int x = 0; x < width; x++) {
            // Считать значения цветовых компонент пикселя
            char color[3];
            input_file.read(color, 3);
 
            // Сжать каждую цветовую компоненту в код Хэмминга (7,4,3)
            vector<char> red_bits(7), green_bits(7), blue_bits(7);
            for (int i = 0; i < 8; i++) {
                red_bits[i] = (color[2] & (1 << i)) >> i;
                green_bits[i] = (color[1] & (1 << i)) >> i;
                blue_bits[i] = (color[0] & (1 << i)) >> i;
            }
            bitset<5> compressed_red(hamming_encode(red_bits).to_ulong() >> 3);
            bitset<5> compressed_green(hamming_encode(green_bits).to_ulong() >> 3);
            bitset<5> compressed_blue(hamming_encode(blue_bits).to_ulong() >> 3);
 
            // Записать сжатые значения в выходной файл
            char compressed_color = (compressed_red.to_ulong() << 4) | (compressed_green.to_ulong());
            output_file.write(&compressed_color, 1);
            compressed_color = compressed_blue.to_ulong();
            output_file.write(&compressed_color, 1);
        }
 
        // Пропустить выравнивание
        input_file.seekg(width % 4, ios::cur);
    }
 
    // Закрыть файлы
    input_file.close();
    output_file.close();
 
    // Вывести информацию о сжатии
    double compression_ratio = 5.0 / 8.0;
    cout << "Сжатие: " << compression_ratio << endl;
 
    return 0;
}
 
 
//Этот код открывает BMP файл `input.bmp` и считывает его содержимое пиксель за пикселем. Затем он сжимает каждую цветовую компоненту вектора длины 7 в код Хэмминга(7, 4, 3) и записывает сжатые значения в выходной файл `output.bin`. Коэффициент сжатия составляет 5 / 8.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.05.2023, 23:02
Ответы с готовыми решениями:

Не могу понять,что не так с кодом
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;vector&gt; using namespace std; class Adventures_of_SIB { public: char...

Не могу понять, что не так с кодом
Задача: Сформировать новый массив, содержащий все элементы исходного массива, у которых сумма цифр, расположенных в четных разрядах равна...

Не могу понять что не так с кодом
randomize ; For v:=1 to 20 Do Begin row:=random(15)+1; game.SetFocus ; gameclick(game); End;

3
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
08.05.2023, 10:09
Что именно не работает и что за проверка != 24 в 55-й?
0
0 / 0 / 0
Регистрация: 06.05.2018
Сообщений: 20
08.05.2023, 12:25  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Что именно не работает и что за проверка != 24 в 55-й?
Программа останавливается на проверке формата BMP (1 скрин), если проверку убрать то вылетает ошибка (2 скрин). В 55-й строке проверяю первые 2 байта файла на сигнатуру BMP ('BM') и 29-й байт на наличие 24 бит на пиксель.
Миниатюры
Не могу понять что не так с кодом (сжатие кодом Хэмминга)   Не могу понять что не так с кодом (сжатие кодом Хэмминга)  
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
08.05.2023, 15:27
Цитата Сообщение от Павел526 Посмотреть сообщение
29-й байт на наличие 24 бит на пиксель.
Этот параметр двухбайтный, а ты int используешь.

Данные надо считывать с позиции bfOffBits. И выравнивание ты, однако, неправильно интерпретируешь. Там сказано, что строка выравнивается на 4-байтную границу, а у тебя width - пиксели.

Начни с простого - опиши структуру со всеми полями и туда считывай, чтобы номера байтов не задавать и типы не путать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.05.2023, 15:27
Помогаю со студенческими работами здесь

Не могу понять, что не так с кодом. Ошибка в коде
Я школьница, объясняют плохо, требуют взломать пентагон, как по мне. Ниже условия задачи, делала по примеру учителя. Запускаю программу,...

Что не так с кодом? ( пытаюсь понять, что не так? )
Есть исходный код. Hook, работает хорошо, но есть минус огромный - перестаёт писать в лог, при открытии программы\игры Фуллскрином. т.е...

Проблему с кодом, выдает исключение не могу понять что к чему
Вот что пишет: Строки нельзя программным способом добавить в коллекцию строк DataGridView, если элемент управления привязан к данным.&quot;...

Шифрование кодом Хэмминга
Очень нужно понять принцип шифрования кодом Хэмминга Что такое информационные символы? Что такое контрольные символы? Как они связаны...

Что не так с кодом
Из числа мы вычитаем число, стоящее перед ним, и так с каждым. Делаем это howmany кол-во раз. Не могу понять, что не так #include...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru