【发布时间】:2018-06-21 22:24:09
【问题描述】:
通过网络发送数据时,可以通过以下几种方式实现字节数据的转换:
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是什么类型?请minimal reproducible example -
*reinterpret_cast<int32_t*>(*inBytes);应该是*reinterpret_cast<int32_t*>(&inBytes);? -
@tobi303 是的,抱歉。我试图缩短我的代码,这就是 & 迷路的地方。 inBytes 是一个无符号字符数组。
-
使用
std::memcpy(除非编译器没有优化掉它)和系统提供的函数(例如ntohl)来确保正确的字节序。 -
@PasserBy :这个。我真的,真的,真的希望更多的程序员这样做。
标签: c++ endianness reinterpret-cast