Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 27
1

Как правильно сохранять шестнадцатеричный код?

13.12.2015, 12:06. Показов 1381. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Очень прошу помощи!
Я открываю в моей программе картинку и получаю ее 16-ый код в текстовом поле. Подскажите пожалуйста как правильно сохранить 16-ый код из этого поля, чтобы на выходе получилась та самая картинка. У меня файл сохраняется, но не открывается, пишет неверный формат файла.
Вот как я сохраняю:
C++ (Qt)
1
2
3
4
5
long length = GetWindowTextLength(hwndbytes); //hwndbytes - дескриптор текстового поля с 16 кодом
TCHAR* data = new TCHAR[length];
GetWindowText(hwndbytes, data, length + 1);
WriteFile(hfile, data, 2*lstrlen(data), &writedBytes, NULL);
CloseHandle(hfile);
Выходит так, что я сохраняю 16 код как текст в файл с разрешением *.bmp, но так не катит, подскажите пожалуйста как правильно или ткните носом!
Заранее огромное спасибо за помощь!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2015, 12:06
Ответы с готовыми решениями:

Как шестнадцатеричный код перевести в код символа
Подскажите пожалуйста. Есть шестнадцатеричный код как его перевести в код символа: ...

Как зашифровать шестнадцатеричный код?
Уважаемые форумчане, прошу у вас помощи, ибо за целый день не нашел ответа! Дано сообщение ...

Как правильно сохранять настройки?
Доброго времени суток бойцы ... Подскажите такую штуку Хочу в файл настроек сохранить массив...

Как правильно сохранять такие строки
Думал-думал и никак не придумал как бы реализовать следующее: Есть два файла (для примера, на...

8
Brainsbreaker
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
13.12.2015, 13:35 2
Сравни размеры файлов.
0
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 27
13.12.2015, 13:44  [ТС] 3
Digit@ll, я сравнивал, сохраняемый в проге больше выходит. На всякий случай вот картинка: imgdisk.ru/images/2015/12/13/circle.png, а вот 16 код из моей программы: rghost.ru/private/7g59FWyWy/11c361d718838b810908b1f337f3a42f
0
Brainsbreaker
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
13.12.2015, 13:56 4
У тебя совершенно два разных файла и это же видно сразу. Открой их и сравни. Данные в txt идут из космоса.
0
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 27
13.12.2015, 14:06  [ТС] 5
Digit@ll, у меня исходная картинка в bmp, это из-за хостинга картинок. вот скрин из программы: https://www.cyberforum.ru/atta... 1450004551
Правилен ли вообще код сохранения? Потому что если я пробую моей программой открыть *.txt файл, а потом сохранить его как файл *.bin, то открыв этот бинарный файл блокнотом, я вижу сохраненный 16 код
Миниатюры
Как правильно сохранять шестнадцатеричный код?  
0
260 / 87 / 30
Регистрация: 29.10.2015
Сообщений: 196
13.12.2015, 15:38 6
В файле, который вы создаете программой, и указанным кодом - не двоичный код картинки. А результат преобразования двоичного кода в "читаемое представление". То есть в поле редактирования вы шестнадцатиричный код записываете в виде последовательностей, состоящих из пар ASCII-символов и пробелов.
А вам нужно перед записью в файл снова преобразовать ваш "читаемый" формат в двоичный.

То есть вам нужно перед сохранением пробежаться по вашему тексту, и каждую встреченную пару ASCII-симвлов - преобразовать в одно единственное char-значение (с помощью самописной функции, или подобной strtol), сложить его в буфер, этот буфер записать в файл.
1
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 27
13.12.2015, 15:49  [ТС] 7
Dreamer_0x01, спасибо большое за ответ, уже понял свою ошибку.
Сделал так:
C++ (Qt)
1
2
3
4
5
6
int sym;
for (int i = 0; i < strlen(data); i=i+2)
{
   sscanf(data + i, "%02X", &sym);
   WriteFile(hfile, &sym, sizeof(byte), &writedBytes, NULL);
}
0
260 / 87 / 30
Регистрация: 29.10.2015
Сообщений: 196
13.12.2015, 17:10 8
Лучший ответ Сообщение было отмечено mak95 как решение

Решение

Если у вас в поле редактирования случайно нарушится порядок (например, пользователь вставит лишний символ), то комбинация конструкции вида "i=i+2" и sscanf приведет к непредсказуемым результатам, как правило ведущим к падению программы.

Функцию scanf и ей подобные вообще нужно использовать с большой осторожностью, так как подсовывание им данных "не по формату" запросто приводит к выходам за границы буфера данных, который она заполняет.

Лучше все-таки использовать функции, либо принимающие максимальный размер буфера, либо функции, уже возвращающие результ в числовом виде, типа atoi, strtol и т.д.
1
0 / 0 / 0
Регистрация: 15.03.2015
Сообщений: 27
13.12.2015, 17:21  [ТС] 9
Спасибо большое за инфу!) Поправлю
0
13.12.2015, 17:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2015, 17:21
Помогаю со студенческими работами здесь

Как правильно сохранять результат работы
Доброго времени суток. Так уж вышло, что возникла необходимость иметь дело с Maple - я в нём...

Как правильно сохранять текст в textarea в БД
Всем здрасте! Юзер может ввесть любой текст в textarea (теги, ',&quot;,\,/, все спец символы, все что...

Как правильно сохранять/восстанавливать данные из Bundle
Доброго дня. Не могу точно разобраться где вызывать сохранение данных в Bundle и извлечение их...

Как правильно сохранять файлы на сервере. Spring MVC
Хелп ми!! Как правильно сохранить картинку в базе или в файловой системе? Сейчас я сохраняю по...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru