Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2015, 14:22   #1
mak15
Пользователь
 
Регистрация: 13.12.2015
Сообщений: 12
По умолчанию Как правильно сохранять шестнадцатеричный код?

Здравствуйте! Очень прошу помощи!
Я открываю в моей программе картинку и получаю ее 16-ый код в текстовом поле. Подскажите пожалуйста как правильно сохранить 16-ый код из этого поля, чтобы на выходе получилась та самая картинка. У меня файл сохраняется, но не открывается, пишет неверный формат файла.
Вот как я сохраняю:
Код:
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, но так не катит, подскажите пожалуйста как правильно или ткните носом!
Заранее огромное спасибо за помощь!

Последний раз редактировалось Stilet; 13.12.2015 в 14:26.
mak15 вне форума Ответить с цитированием
Старый 13.12.2015, 14:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Ты не конвертируешь назад в байты. BMP же не текстовый формат. С потолка могу предложить такое:
Код:
unsigned short int i;
sscanf(data,"%x",&i);
WriteFile(hfile, i, sizeof(i), &writedBytes, NULL);
Т.е. нужна конвертация из НЕХ в байт.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.12.2015, 15:36   #3
mak15
Пользователь
 
Регистрация: 13.12.2015
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Хм... Ты не конвертируешь назад в байты. BMP же не текстовый формат. С потолка могу предложить такое:
[CODE]
unsigned short int i;
sscanf(data,"%x",&i);
WriteFile(hfile, i, sizeof(i), &writedBytes, NULL);
Т.е. нужна конвертация из НЕХ в байт.
Stilet, спасибо большое за помощь!
В общем вот как я сделал:
Код:
int sym;
for (int i = 0; i < strlen(data); i=i+2)
{
   sscanf(data + i, "%02X", &sym);
   WriteFile(hfile, &sym, sizeof(byte), &writedBytes, NULL);
}
В массиве data хранится 16 код. Функция sscanf заносит в sym ascii код переведенного символа и записывает его в файл. Это работает, картинка реально сохраняется и открывается. Может можно сделать получше, чем я написал?
mak15 вне форума Ответить с цитированием
Старый 13.12.2015, 18:17   #4
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Шестнадцатричными бывают цифры, а не числа, а бинарный файл состоит из чисел. Ну да, на экране цифрами записаны числа. Но на самом деле это лишь текстовая запись чисел, а в файле они должны быть как есть. Сами числа нельзя вывести ни в окно, ни на печать, можно только преобразовать их в текст и отрисовать этот текст, либо перевести числа в положение стрелок, или точек линии графика, размеры столбиков/пузырьков/секторов и отрисовать уже это. Но у Вас не график, а цифры, значит только перевод в текст. При сохранении неизбежен обратный перевод. И редактировать с клавы можно только текст, но не числа. Вот представь себе: ты общаешься с иностранцем, ни ты, ни он не знаете языков друг друга, при разговоре присутствует переводчик, который переводит тебе реплики иностранца. Эйси. Но теперь ты спрашиваешь, есть ли решение лучше, чем переводить и твои реплики на иностранный. Хуже есть, но иностранец не поймёт. А лучше то откуда возьмётся?
taras-proger вне форума Ответить с цитированием
Старый 13.12.2015, 18:22   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
бинарный файл состоит из чисел
Ну да, придумал. Из байт, каждый из которых по 8 двоичных бит содержит. А уж интерпретировать каждый байт или их группу можно и как числа, и как символы. Короче как программистом в программе пишущей и читающей файл предусмотрено
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.12.2015, 18:26   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Шестнадцатричными бывают цифры, а не числа
Это тебе кто сказал такую чушь?
15 - это число или цифра?
Цитата:
int sym;
Я бы на твоем месте всетки int не использовал. Все же он не совсем для байта подходит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.12.2015, 18:45   #7
mak15
Пользователь
 
Регистрация: 13.12.2015
Сообщений: 12
По умолчанию

Stilet, я пробовал брать меньше, но прога крашится с указанием на sym, поэтому при записи я указываю размер byte, думаю размер переменной sym в таком случае практически не влияет (могу ошибаться)

taras-proger, если ты плохо знаешь иностранный язык и захочешь что-то объяснить иностранцу, ты будешь говорить "вокруг да около". Иностранец может понять такого человека, но это займет энное время и загрузит человека. Знающий же сможет быстро и просто человеку рассказать. Я отношу себя к плохознающим, поэтому и спрашиваю: вдруг тут есть что-то получше.
mak15 вне форума Ответить с цитированием
Старый 13.12.2015, 19:09   #8
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это тебе кто сказал такую чушь?
15 - это число или цифра?
Это запись числа. А символ "1" - это цифра. Также и символ "D" - цифра. Совпадение глифа с глифом буквы сути не меняет. Число может быть записано одной цифрой, но оно - не цифра. 15 десятичное = F шестнадцатеричное = 1111 двоичное, = 120 троичное. Обратите внимание: записи и основания разные, а число одно и то же, оно от системы счисления не зависит и может быть записано хоть как 111111111111111 унарное. Или 3FD6 шестнадцатеричное. Это не только 3FD6, но и 16342 десятичное, и 11111111010110 двоичное, и 211102021 троичное. Опять число одно, а основания разные. Так что по чуши здесь ты специалист. А уж цифра 15 - это вообще шедевр. Цифры не могут быть двузначные, так как они сами знаки.

Цитата:
Сообщение от mak15 Посмотреть сообщение
taras-proger, если ты плохо знаешь иностранный язык и захочешь что-то объяснить иностранцу, ты будешь говорить "вокруг да около"
Ты походу русский плохо знаешь. Я же сказал:
Цитата:
не знаете
. То есть совсем. И ни какого вокруг. Мысль излагается чётко, но по-русски. Иностранец не поймёт, пока ему не переведёшь назад на иностранный.

Последний раз редактировалось Stilet; 13.12.2015 в 19:30.
taras-proger вне форума Ответить с цитированием
Старый 13.12.2015, 19:15   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Шестнадцатричными бывают цифры, а не числа
Ты не понял. 15 это шестнадцатиричная запись десятичного числа 21. И оно не цифра, а число.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.12.2015, 19:16   #10
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от mak15 Посмотреть сообщение
Я отношу себя к плохознающим, поэтому и спрашиваю: вдруг тут есть что-то получше.
Не надо знать английский, чтоб понять, что если француз и англичанин языков друг друга совсем не знают, то англичанин француза не поймёт, пока ему не переведут.
taras-proger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определите и запишите в протокол шестнадцатеричный объектный код для следующих директив резервирования памяти nelo_001 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 28.06.2014 00:30
Как правильно применить код? artemavd Общие вопросы Delphi 5 05.06.2012 22:15
Как правильно сохранять имена файлов. Jl6owa Общие вопросы Delphi 4 19.03.2012 01:48
Делфи. как правильно вставить код в код? Кушманский Помощь студентам 13 18.03.2012 20:06
Как правильно оформить код? NiKiToZZ- Помощь студентам 5 28.12.2010 12:26