使用重新解释强制转换时交换字节序
Swapping endians when using reinterpret cast
当通过网络发送数据时,可以通过多种方式实现字节数据的转换:
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上使用(?
联合和重新解释 Cast 方法面临大端与小端的问题,但一旦使用浮点数,就会派上用场,因为简单的位移不足以将数据转换回来。使用reinterpret_cast时如何交换字节序?
您使用重新解释和访问不活跃的工会成员都违反了标准。 这样说的规则被称为严格别名。
因此,在您的选项中,换档是唯一符合标准的选项。
另一个选项 - memcpy 直接进入目标类型 - 也符合标准。
你可以合法地通过memcpy到堆栈阵列,放置新的bew tyoe,然后memcpy回来。 优化器将消除内存!
您甚至可以这样做:
template<class T>
struct raw_bytes:
std::array<char, sizeof(T)>
{
static_assert(std::is_pod<T>::value, "pod only");
static raw_bytes to_raw( T in ){
raw_bytes r;
std::memcpy( r.data(), std::addressof(in), sizeof(T) );
return r;
}
// this object no longer valid after convert, but returned reference is until this object destroyed
T& convert(){
char tmp[sizeof(T)];
memcpy(tmp, data(), sizeof(T));
T* r= ::new( (void*)data() ) T;
memcpy(r, tmp, sizeof(T));
return *r;
}
};
这可能值得,也可能不值得。
您可以将raw_bytes
粘贴到结构中,并将字节写入其中。 然后,您可以将这些字节就地convert()
到T
。 返回的引用是合法访问这些字节的唯一方法;在严格阅读标准的情况下,raw_bytes
方法不再合法。
你不能。Reinterprert 强制转换仅更改编译器使用的类型,不会触及数据。
如如何在C++中的大端和小端值之间转换中建议的?用
int32_t __builtin_bswap32 (int32_t x)
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 复制交换习惯用法-我们可以在这里使用动态强制转换操作吗
- 使用重新解释强制转换时交换字节序
- 将短文转换为二进制..由于某种原因,前 8 位数字和后 8 位数字被交换
- 如何生成通过交换元素将一个数组转换为另一个数组的步骤(例如:从{0,1,2}到{0,2,1})