реклама на сайте
подробности

 
 
> *char to long, получение long из массива char
juvf
сообщение Nov 27 2017, 05:42
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Нужно из массива байт получить int, long, float, uint32_t и т.п. Явное приведение типов не всегда и не везде работает из-за "выравнивания".

писать китайский код типа

uint32_t p = (uint32_t)array[7];
p |= (uint32_t)array[8] << 8;
p |= (uint32_t)array[9] << 16;
p |= (uint32_t)array[10] << 24;

надоело, да и нецелесообразно.
Можно сделать шаблон для всех типов, но ездить в Тулу со своим самоваром перетаскивать из проекта в проект свой шаблон.... сами понимаете....

Наверняка есть либо в std, либое ещё где уже готовые методы/шаблоны. Или уже кем-то ураденно написано... только нужно знать, где это взять. Кто-нибудь может подсказать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
gerber
сообщение Nov 27 2017, 09:25
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(juvf @ Nov 27 2017, 08:42) *
Нужно из массива байт получить int, long, float, uint32_t и т.п. Явное приведение типов не всегда и не везде работает из-за "выравнивания".

Какое ещё выравнивание, если у вас массив байт? rolleyes.gif
Код
uint32_t p = *(uint32_t*)&array[7];


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Nov 27 2017, 09:28
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(gerber @ Nov 27 2017, 13:25) *
Какое ещё выравнивание, если у вас массив байт? rolleyes.gif
Код
uint32_t p = *(uint32_t*)&array[7];

Многие процессоры требуют выравнивания 4-байтовых целых по адресу, кратному 4, 2-байтовых - кратному 2, float и double - 4 и 8 соответственно. Там такое выражение может привести к срабатыванию системного прерывания и вылету из программы. А может не привести (как повезет с адресами).
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 22:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016