从二进制缓冲区初始化变量的正确方法是什么?

时间:2017-01-23 14:14:54

标签: c++ variables memory binary initialization

我经常遇到这样的情况:我通过协议接收打包的二进制数据(即变量未正确对齐),数据通常出现在std :: string,std :: vector或者某些其他这样的容器。

我的问题是解压缩此类数据的最佳做法是什么?我通常会执行以下操作:

int32_t x = *((int32_t*)charPtr);

或迭代器

int32_t x = *((int32_t*)(&(*itt)));

但是这些真的感觉像是一个黑客,虽然它们可能被包含在模板函数中,但是没有更直接的方法来告诉编译器我想要什么吗?

1 个答案:

答案 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;
}