При отправке данных по сети преобразование байтовых данных может осуществляться несколькими способами:
12345 --> {0 0 48 57}
typedef unsigned char byte;
//1. Bit shift
int32_t shiftedInteger = (int32_t) (inBytes[0] << 24 | inBytes[1] << 16 |
inBytes[2] << 8 | inBytes[3]);
//2. Reinterpret cast
int32_t reinterpretedInteger = *reinterpret_cast<int32_t*>(&inBytes);
//3. Using unions
union{
byte b[4];
int32_t i;
}unionCast;
memcpy(unionCast.b,inBytes,4);
int_32t unionCasted = unctionCast.i;
Какой способ преобразования данных предпочтительнее (использование на Arduino, подобном микропроцессору)?
Метод union и reinterpretCast сталкивается с проблемами больших и маленьких байтов, но пригодится при работе с числами с плавающей запятой, поскольку простых битовых сдвигов будет недостаточно для обратного преобразования данных. Как поменять местами порядок байтов при использовании reinterpret_cast?
inBytes
? Пожалуйста, минимальный воспроизводимый пример - person 463035818_is_not_a_number   schedule 12.01.2018*reinterpret_cast<int32_t*>(*inBytes);
должно быть*reinterpret_cast<int32_t*>(&inBytes);
? - person 463035818_is_not_a_number   schedule 12.01.2018std::memcpy
(если только компилятор не оптимизирует его) и предоставленную системой функцию (например,ntohl
) для обеспечения правильного порядка следования байтов. - person Passer By   schedule 12.01.2018