Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запись в шестнадцатеричном формате, Неполучается...%( 
:(
    Опции темы
CoDecode
Дата 23.4.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2008
Где: Украина, Херсонск ая обл.

Репутация: нет
Всего: нет



Ребята, есть проблема.. Я фонарю в си.. fprintf( fo, "%x\n", arg), это я записую в файл fo переменную arg равную 0x80. Но в файле пишется не информация в hex'е а просто значение этой информации, то есть буквально "80", что в hex означает совсем другое. Вообще переменная обозначается как int arg=0x80. Может не INT? smile 
PM MAIL   Вверх
Rififi
Дата 23.4.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



в форматной строке могут быть любые символы. в таком случае они выводятся как есть.
"0x%x\n"
PM MAIL   Вверх
CoDecode
Дата 23.4.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2008
Где: Украина, Херсонск ая обл.

Репутация: нет
Всего: нет



Так а как вообще сделать так, чтоб символ соответствовал значению 0x80? То есть записаный символ в HEX равен 0x80 (128)?  
PM MAIL   Вверх
Dmi3ev
Дата 23.4.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



надо пользоваться функцией atol


--------------------

PM MAIL   Вверх
CoDecode
Дата 23.4.2008, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2008
Где: Украина, Херсонск ая обл.

Репутация: нет
Всего: нет



Ниче не понял.. Причем тут преобразование строки в целое значение? Я что-то путаю?
PM MAIL   Вверх
CoDecode
Дата 23.4.2008, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2008
Где: Украина, Херсонск ая обл.

Репутация: нет
Всего: нет



Карочь, браццы, скажите как переводить intы от 0 до 255 в ASCII символы?
PM MAIL   Вверх
jonie
Дата 23.4.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

int a=0x31;
char b = static_cast<char>(a);

?
или тебе надо число превратить в строку?
число 32 НЕ равно строке '32'

вообще, если строго говорить, то число 0x31 не равно '1'... т.к. это справедливо только в определенных кодировках и т.п....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 24.4.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(CoDecode @ 23.4.2008,  21:54)
Карочь, браццы, скажите как переводить intы от 0 до 255 в ASCII символы?

Нифига не понял, какие числа в какие символы, при чем здесь HEX?  smile Если надо вывести символ, то так и пиши fprintf( fo, "%c\n", arg);

PM MAIL   Вверх
CoDecode
Дата 24.4.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2008
Где: Украина, Херсонск ая обл.

Репутация: нет
Всего: нет



Притом xvr. Тут дело кароче в том, что программа читает не символы, а значения этих символов. К примеру 
if (a==97) BOOM; но прога читает не сами символы "97" а символ ascii имеющий это значение, то есть латинскую малую "a". Таким кандибобером можно работать с помощью кода
---------------------------------------
int arg=97;
unsigned code;
code=arg;
FILE * fo;
fo = fopen("/file.xxx","w");
fprintf( fo, "%c", code);
----------------------------------------
сунит в файл АСКИ-значение 97. Но это работает тока для 8-битных значений, а как для 16-, 32-битных бы, га? 
PM MAIL   Вверх
xvr
Дата 24.4.2008, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(CoDecode @ 24.4.2008,  14:32)
Притом xvr. Тут дело кароче в том, что программа читает не символы, а значения этих символов. 

Компьютер вообще работает только с числами  smile 
Цитата

К примеру if (a==97) BOOM; но прога читает не сами символы "97" а символ ascii имеющий это значение, то есть латинскую малую "a". 
Я открою страшную тайну - тип char в С это 8ми битный integer, со всеми вытекающими последствиями. Выражение 'a' имеет тип целое (байтовое) и величину 97. Отличие 97 от 'a' только в размере (и типе) целого - первое int, второе char.
НИКАКОЙ другой разницы между ними нет.
Цитата

Таким кандибобером можно работать с помощью кода
---------------------------------------
int arg=97;
unsigned code;
code=arg;
FILE * fo;
fo = fopen("/file.xxx","w");
fprintf( fo, "%c", code);
----------------------------------------
сунит в файл АСКИ-значение 97. 

Сунет, можно даже проще: fprintf( fo, "%c", 97);, просто сунет байт 97 в файл
Цитата

Но это работает тока для 8-битных значений, а как для 16-, 32-битных бы, га?
А что такое 16ти и тем паче 32ти битные char'ы? Если имеется в виду Unicode, то  fprintf( fo, "%С", 0x0410); (Русская 'А', 16 бит)
PM MAIL   Вверх
CoDecode
  Дата 25.4.2008, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2008
Где: Украина, Херсонск ая обл.

Репутация: нет
Всего: нет



Спасибо! 
Я вот тут заметил, в HEX-редакторе цифры со значением от 000 до 255 могут принять 16-битное значение, например 511 если следующая за ней цифра имеет значение 001. То есть получается какая-то степень, что ли.. Вот мне интересно; чтобы записать 16-битное число, к примеру 511 нужно что организовать программно алгоритм по смещению, или есть другие способы?
PM MAIL   Вверх
xvr
Дата 25.4.2008, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(CoDecode @ 25.4.2008,  18:54)
Спасибо! 
Я вот тут заметил, в HEX-редакторе цифры со значением от 000 до 255 могут принять 16-битное значение, например 511 если следующая за ней цифра имеет значение 001. 

А значение синуса в военное время до 2х доходит  smile 
Цитата

То есть получается какая-то степень, что ли.. 
Угу, степень кривизны HEX редактора. Значения 1 БАЙТА (беззнаковае) могут лежать в диапазоне 0-255 включительно, числа (беззнаковые) в диапазоне 0-255 могут быть представленны 1 байтом. Точка. Никакие HEX редакторы не смогут этого изменить.
Цитата

Вот мне интересно; чтобы записать 16-битное число, к примеру 511 нужно что организовать программно алгоритм по смещению, или есть другие способы?
Для тех, кто сможет записать 16ти битное число в один байт рекомендуется постельный режим, теплое питье, полный покой и НИКАКИХ КОМПЬЮТЕРОВ  smile 
А если серьезно, то я не понял что и куда ты собрался писать

Это сообщение отредактировал(а) xvr - 25.4.2008, 19:43
PM MAIL   Вверх
CoDecode
  Дата 25.4.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2008
Где: Украина, Херсонск ая обл.

Репутация: нет
Всего: нет



xvr человечище прикольный! smile 
Я просто в таких делах.. В основном я программировал в Бейсике, на винде и программировал не такие вещи а проще сказать событийным подходом, типа "жми и увидишь отакое  smile ", и поэтому затрудняюсь в таких вопросах...
Цитата

А если серьезно, то я не понял что и куда ты собрался писать
 
Я просто заметил что 1 БАЙТ в совокупности со следующим будет составлять 16-битное значение. Ну например 
-------------------------------------------------
[255 001] 240 020..........
       |
16-битное
значение, равное
     511
-------------------------------------------------
...и вот-т-т-т... Ну я вот не пойму как записать число 511 так, чтоб оно было равно двум БАЙТам, с вот такими вот, видимо значениями...
PM MAIL   Вверх
xvr
Дата 26.4.2008, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(CoDecode @ 25.4.2008,  22:59)
Я просто заметил что 1 БАЙТ в совокупности со следующим будет составлять 16-битное значение. Ну например 
-------------------------------------------------
[255 001] 240 020..........
       |
16-битное
значение, равное
     511

Будет. Можно читать/писать и по 3 байта и по 4 - это вопрос трактовки. Для начала нужно определиться, какой файл мы собираемся читать/писать - текстовый или бинарный (кстати, это опять же вопрос трактовки - СОДЕРЖИМОЕ файла от этого не изменится, изменится лишь то, как мы будем его понимать)
Если файл текстовый, то он однозначно воспринимается как последовательность байтов (одиночных), каждый из которых представляет один символ. (Мы пока оставим в стороне текстовые форматы в Unicode - там все сложнее, их лучше рассматривать как бинарные).
Если же файл бинарный, то мы вольны группировать и трактовать последовательности байтов в нем как нам нужно.
Любое число (в памяти компьютера) занимает от 1го до скажем 4х байтов (char, short, long), память, занимаемая числом так же можно рассматривать как одно неделимое целое (4660 = 0x1234) или как последовательность байтов (0x34, 0x12). Эту последовательность можно записать или прочесть из файла просто как участок памяти:
Код

int value=0x12345678;

fwrite(&value,sizeof(value),1,my_file);
fread(&value,sizeof(value),1,my_file);

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

PS. С форматом представления чисел в памяти тоже не все просто - на разных платформах они представляются по разному. Intel представляет их в формате LSB (Less Significant Byte [first] - Младшими разрядами вперед)  - по младшему адресу в памяти находятся младшие биты числа (0x12345678 => 0x78, 0x56, 0x34, 0x12), Motorola в формате MSB (Most Significant Bytes [fist] - Старшими разрядами вперед) - в обратном порядке (0x12345678 => 0x12, 0x34, 0x56, 0x78)

PM MAIL   Вверх
CoDecode
Дата 26.4.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2008
Где: Украина, Херсонск ая обл.

Репутация: нет
Всего: нет



Вот спасибо!!! Вводной курс в "байтологию"! smile Отлично получается! И зачем это ASCII здалось!? smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0916 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.