Сейчас на форуме: tyns777, zds, JustLife, 2nd, morgot (+5 невидимых)

 eXeL@B —› Программирование —› Visual C++ 6 дамп и приобразование в int
Посл.ответ Сообщение

Ранг: 52.1 (постоянный)
Активность: 0.010
Статус: Участник

Создано: 10 июня 2009 16:25
· Личное сообщение · #1

Мир всем )
Вынудила меня задачка сделать следующую операцию:
Считать по некому смещению из дампа 4 байта, примеру 04 00 A0 01. Читаю с помощью Read из CStdioFile. Загоняю в char str[4]; Проблема номер 1. Когда под отладчиком я смотрю на считанный массив в str, все как бы нормально кроме байта A0! Он почему то читается как -96.. Почему так происходит?
И подскажите пожалуйста, как проще всего мне перегнать этот 04 00 A0 01 в UINT переменную, чтоб можно было ее плюсить, множить и так далее...
Заранее спасибо!



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 10 июня 2009 17:01
· Личное сообщение · #2

int по умолчанию signed.

-----
Shalom ebanats!




Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 10 июня 2009 17:01
· Личное сообщение · #3

>>Загоняю в char str[4];
>>Он почему то читается как -96.. Почему так происходит?
Загоняй в unsigned char str[4];

>>как проще всего мне перегнать этот 04 00 A0 01 в UINT переменную
unsigned int ui;
и загоняй в &ui вместа str




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 10 июня 2009 17:34
· Личное сообщение · #4

для преобразования достаточно предложенного arnix'ом. Но если нужен вариант и побайтовый (для контроля чтения) и UINT, то UNION в руки
union {
unsigned char str[4];
unsigned int ui;
} u;

read(u.str); // чтение
aaa+u.ui; // использование

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 45.7 (посетитель), 5thx
Активность: 0.020
Статус: Участник

Создано: 10 июня 2009 19:23 · Поправил: Fallout
· Личное сообщение · #5

>>Он почему то читается как -96.. Почему так происходит?
Потому что это визуальное представление в отладчике в соответствии с типом переменной... физически разницы нет в твоем случае между signed или unsigned никакой..... в хексе -96 как раз и будет 0xA0 .... преобразовать потом в целое типа int можешь например так....


unsigned int my_val = *(unsigned int*)str;

п.с: имя масива уже является адресом.. ....



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 10 июня 2009 19:27
· Личное сообщение · #6

Учи мат.часть!

-96 в дополнительном коде это как раз 0xA0.

А вообще не судьба было запустить калькулятор - набрать -96 и перевести в hex ? Получаем FFFFFFFFFFFFFFA0. Младший байт - твой.



Ранг: 52.1 (постоянный)
Активность: 0.010
Статус: Участник

Создано: 11 июня 2009 09:11
· Личное сообщение · #7

Благодарствую!
progopis: Да запускал. проверял. Да, было FFFFFFA0. Тольько блин почему именно A0, в этом вопрос был.



Ранг: 52.1 (постоянный)
Активность: 0.010
Статус: Участник

Создано: 11 июня 2009 09:48
· Личное сообщение · #8

Спасибо arnix'у! Прочиталось замечательно! Только вот в файле запись big endian. В итоге в переменной у меня оказывается 01 A0 00 04 )) В gcc я помню есть функция ntohl, но в Visual C не катит. Говорит нет такой. Чем мне порядок байт поменять?



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 11 июня 2009 10:10
· Личное сообщение · #9

например этим:

Code:
  1. unsigned int dword_big2lit(unsigned int val)
  2. {
  3.     unsigned int tmp = 0;
  4.     unsigned int i;
  5.     
  6.     for (= 0; i < sizeof tmp; i++)
  7.     {
  8.         ((unsigned char*)&tmp)[(sizeof tmp) - 1] &= 0;
  9.         ((unsigned char*)&tmp)[(sizeof tmp) - 1] |= ((unsigned char*)&val)[(sizeof tmp) - 1];
  10.         if (< (sizeof tmp) - 1)
  11.         {
  12.             tmp >>= 8;
  13.             val <<= 8;
  14.         }
  15.     }
  16.     
  17.     return tmp;
  18. }




Ранг: 52.1 (постоянный)
Активность: 0.010
Статус: Участник

Создано: 11 июня 2009 10:32
· Личное сообщение · #10

arnix благодарю тебя! все работает!


 eXeL@B —› Программирование —› Visual C++ 6 дамп и приобразование в int
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати