![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| klein |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 111 Регистрация: 30.5.2006 Где: Київ Репутация: нет Всего: нет |
Привет.
Есть масив из 2 байт (char). Хочу преобразовать в int. Масив читаю с файла, получаемые результаты упорно не совпадают с показаниями хекс редактора. Компилятор - visual studio 2010.
Спасибо |
|||
|
||||
| KaraKum |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Хех, с удивительным везением все 3 метода использованы немного неверно
Читается 4 байта, а в исходном массиве всего два - этот метод вообще не подойдёт.
Вот так должно отработать:
При условии что порядок байт в "little endian" (что почти наверняка).
Копируется только один байт, нужно 2 и не в адрес указателя на массив, а в сам массив:
Это сообщение отредактировал(а) KaraKum - 29.3.2011, 17:43 |
||||||||||
|
|||||||||||
| klein |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 111 Регистрация: 30.5.2006 Где: Київ Репутация: нет Всего: нет |
KaraKum
Спасибо за оперативную помощь. Второй метод не работает. А третий -
выдает 0. Немогу понять почему &result + 2 ? Это сообщение отредактировал(а) klein - 29.3.2011, 18:00 |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Данные в памяти в случае с "little endian" располагаются от старшего байта к младшему при увеличении адреса. То в есть response нужно скопировать два байта в конец, а указатель на него указывает на первый его байт, поэтому и прибавляем два.
Странно что второй метод не работает - нужно тогда попробовать явно преобразовывать к (int):
А что значит "не работает"? Что в итоге получается? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
проблема переносимости #1
int практически на всех платформах имеет размер 4 байта, так что не пройдет. проблема переносимости #2 Вышеупомянутый endianness. Работать будет не на всех платформах. проблема переносимости #3 Так вообще делать нельзя, по причине проблемы выравнивания на некоторых системах. |
|||
|
||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Для "little endian" должно быть наоборот -
PS. Последний вариант на платформе с требованием к выравниванию более строгими, чем у x86, может не работать |
||||||||
|
|||||||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Эмм, немного не понял. Под нулевым индексом в массиве buf находится старший байт, а в следующем индексе (по ходу увеличения адреса памяти) находится младший. Посредством (buf[0] << 8) | buf[1] получается проецирование этой области памяти в два байта из buf в result? |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
|
||||
|
|||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Да. Я перепутал.
|
|||
|
||||
| klein |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 111 Регистрация: 30.5.2006 Где: Київ Репутация: нет Всего: нет |
Всем спасибо, оч помогли.
Может кому понадобитса:
|
|||
|
||||
| KaraKum |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Эмм, так разве работает? xvr же дал мне подзатыльник по поводу того что я перепутал little endian с big endian. После чего, теоретически, стало ясно что на little endian должен работать вариант
или, что тоже самое:
то есть наоборот по сравнению с приведённым якобы работающим результатом. Видимо это проверялось на компьютере с big endian порядком, что сегодня довольно-таки редко. Какой компьютер? |
||||
|
|||||
| klein |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 111 Регистрация: 30.5.2006 Где: Київ Репутация: нет Всего: нет |
Виртуальная машина Parallels Desktop.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |