Приведение типов. Как можно обмануть компилятор?
- Войдите на сайт для отправки комментариев
Чт, 31/12/2015 - 17:37
Доброго времени суток!
Есть бинарный массив, напрмер:
byte buffer[] = { 0x15, 0x1, 0x0, 0x0, 0x0, 0x3, 0x11 }
Мне необходимо взять первые 4 байта и перевести их в число unsigned long
unsigned long *ptrBuffer = &buffer;
Но тут компилятор категорически отказывается делать такое безобразие. Я так понимаю необходимо приведение типов перед использованием указателя, но что то не получается. Подскажите как это сделать.
ЗЫ. Понимаю что можно сделать так
buffer[0] + buffer[1] * 256 + buffer[2] * 65536 + buffer[3] * 16777216
но как то это громозко и не спортивно
Хех! Вот же оно!
Всего-то подумать надо было! И чего не подумать прежде, чем десткий вопрос постить? Почему наоборот всегда?
Кстати, уберите & во второй строке. "На скорость", конечно, не влияет, но некрасиво.
(unsigned
long
*)buffer
от меня ускользает смысл вот этого действия (то что в скобках), где можно об этом почитать?
long
*) это тип к которому приводится данные, а символ * говорит о том что это не переменная а указатель на переменную т.к.
unsigned
long
*ptrBuffer- тоже не переменная а указатель на переменную
Спасибо!
почитай по С++
Чтобы не париться с приведением типов, а также совершить меньше ошибок, сделайте структуру, типа:
Это визуально понятней, да и кошерней. Если не знаете, что такое struct, почитайте - в гугле море информации.
(unsigned
long
*)buffer
от меня ускользает смысл вот этого действия (то что в скобках), где можно об этом почитать?
http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf
Адреса у переменных var_x будут совпадать с адресами буфера 0-вого и 4-ого индекса.
И никаких лишних переменных, всё в одной области памяти.
Читаем - Union
Оба метода хороши. И код дадут в общем одинаковый. Приведение считается менее соответствующим концепции языка и дающим больше шансов програмисту ошибится. Юнионы явно задают соответствие переменных, зато более громоздкие и снижают читаемость кода. Профи чаще "шалят" с приведением, за что иногда выгребают.
Вобще прииспользовании таких техник важно знать что такое выравнивание данных и следить за ним.
Всем спасибо за помощь!