我经常遇到这样的情况:我通过协议接收打包的二进制数据(即变量未正确对齐),数据通常出现在std :: string,std :: vector或者某些其他这样的容器。
我的问题是解压缩此类数据的最佳做法是什么?我通常会执行以下操作:
int32_t x = *((int32_t*)charPtr);
或迭代器
int32_t x = *((int32_t*)(&(*itt)));
但是这些真的感觉像是一个黑客,虽然它们可能被包含在模板函数中,但是没有更直接的方法来告诉编译器我想要什么吗?
答案 0 :(得分:1)
正确的,避免未定义的行为,这样做的方法是:
int32_t x;
memcpy(&x, charPtr, sizeof(x));
可以包装在函数模板中:
template <class T,
std::enable_if_t<std::is_trivially_default_constructible<T>::value &&
std::is_trivially_copyable<T>::value, int> = 0>
T unpack(unsigned char* p) {
T val;
memcpy(&val, p, sizeof(val));
return val;
}