Посл.ответ |
Сообщение |
Ранг: 52.1 (постоянный) Активность: 0.01↘0 Статус: Участник
|
Создано: 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.17↘0 Статус: Участник
|
Создано: 10 июня 2009 17:01 · Личное сообщение · #2
int по умолчанию signed.
----- Shalom ebanats! | Сообщение посчитали полезным: |
Ранг: 210.5 (наставник), 2thx Активность: 0.14↘0 Статус: Участник
|
Создано: 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.16↘0.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.02↘0 Статус: Участник
|
Создано: 10 июня 2009 19:23 · Поправил: Fallout · Личное сообщение · #5
>>Он почему то читается как -96.. Почему так происходит? Потому что это визуальное представление в отладчике в соответствии с типом переменной... физически разницы нет в твоем случае между signed или unsigned никакой..... в хексе -96 как раз и будет 0xA0 .... преобразовать потом в целое типа int можешь например так.... unsigned int my_val = *(unsigned int*)str; п.с: имя масива уже является адресом.. ....
| Сообщение посчитали полезным: |
Ранг: 101.0 (ветеран), 344thx Активность: 1.15↘0 Статус: Участник
|
Создано: 10 июня 2009 19:27 · Личное сообщение · #6
Учи мат.часть! -96 в дополнительном коде это как раз 0xA0. А вообще не судьба было запустить калькулятор - набрать -96 и перевести в hex ? Получаем FFFFFFFFFFFFFFA0. Младший байт - твой.
| Сообщение посчитали полезным: |
Ранг: 52.1 (постоянный) Активность: 0.01↘0 Статус: Участник
|
Создано: 11 июня 2009 09:11 · Личное сообщение · #7
Благодарствую! progopis: Да запускал. проверял. Да, было FFFFFFA0. Тольько блин почему именно A0, в этом вопрос был.
| Сообщение посчитали полезным: |
Ранг: 52.1 (постоянный) Активность: 0.01↘0 Статус: Участник
|
Создано: 11 июня 2009 09:48 · Личное сообщение · #8
Спасибо arnix'у! Прочиталось замечательно! Только вот в файле запись big endian. В итоге в переменной у меня оказывается 01 A0 00 04 )) В gcc я помню есть функция ntohl, но в Visual C не катит. Говорит нет такой. Чем мне порядок байт поменять?
| Сообщение посчитали полезным: |
Ранг: 210.5 (наставник), 2thx Активность: 0.14↘0 Статус: Участник
|
Создано: 11 июня 2009 10:10 · Личное сообщение · #9
например этим:
| Сообщение посчитали полезным: |
Ранг: 52.1 (постоянный) Активность: 0.01↘0 Статус: Участник
|
Создано: 11 июня 2009 10:32 · Личное сообщение · #10
arnix благодарю тебя! все работает!
| Сообщение посчитали полезным: |