| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Int из масива байт. |
| Автор: klein 29.3.2011, 17:30 | ||
| Привет. Есть масив из 2 байт (char). Хочу преобразовать в int. Масив читаю с файла, получаемые результаты упорно не совпадают с показаниями хекс редактора. Компилятор - visual studio 2010.
Спасибо |
| Автор: KaraKum 29.3.2011, 17:40 | ||||||||||
Хех, с удивительным везением все 3 метода использованы немного неверно
Читается 4 байта, а в исходном массиве всего два - этот метод вообще не подойдёт.
Вот так должно отработать:
При условии что порядок байт в "little endian" (что почти наверняка).
Копируется только один байт, нужно 2 и не в адрес указателя на массив, а в сам массив:
|
| Автор: klein 29.3.2011, 18:00 | ||
| KaraKum Спасибо за оперативную помощь. Второй метод не работает. А третий -
выдает 0. Немогу понять почему &result + 2 ? |
| Автор: KaraKum 29.3.2011, 18:13 | ||
| Данные в памяти в случае с "little endian" располагаются от старшего байта к младшему при увеличении адреса. То в есть response нужно скопировать два байта в конец, а указатель на него указывает на первый его байт, поэтому и прибавляем два. Странно что второй метод не работает - нужно тогда попробовать явно преобразовывать к (int):
А что значит "не работает"? Что в итоге получается? |
| Автор: azesmcar 29.3.2011, 20:31 |
| проблема переносимости #1 int практически на всех платформах имеет размер 4 байта, так что не пройдет. проблема переносимости #2 Вышеупомянутый http://en.wikipedia.org/wiki/Endianness. Работать будет не на всех платформах. проблема переносимости #3 Так вообще делать нельзя, по причине проблемы выравнивания на некоторых системах. |
| Автор: KaraKum 30.3.2011, 11:50 |
Эмм, немного не понял. Под нулевым индексом в массиве buf находится старший байт, а в следующем индексе (по ходу увеличения адреса памяти) находится младший. Посредством (buf[0] << 8) | buf[1] получается проецирование этой области памяти в два байта из buf в result? |
| Автор: xvr 30.3.2011, 18:48 | ||||
|
| Автор: KaraKum 30.3.2011, 18:55 |
| Да. Я перепутал. |
| Автор: klein 1.4.2011, 13:24 | ||
| Всем спасибо, оч помогли. Может кому понадобитса:
|
| Автор: KaraKum 1.4.2011, 13:39 | ||||
Эмм, так разве работает? xvr же дал мне подзатыльник по поводу того что я перепутал little endian с big endian. После чего, теоретически, стало ясно что на little endian должен работать вариант
или, что тоже самое:
то есть наоборот по сравнению с приведённым якобы работающим результатом. Видимо это проверялось на компьютере с big endian порядком, что сегодня довольно-таки редко. Какой компьютер? |
| Автор: klein 1.4.2011, 16:17 |
| Виртуальная машина Parallels Desktop. |