以未定义的数据类型交换字节顺序

时间:2018-07-08 09:27:32

标签: c++ templates endianness

我正在用C ++编写自己的二进制文件读取器。我给它一个输入流,然后有一个模板函数,该函数使用一个指向类型的指针,然后从文件中读取sizeof(type)个字节,并将它们存储在内存中,从指向类型的指针开始。

但是,我现在需要指定某些类型的字节序。如果使用大字节序,则必须交换字节顺序。

正常的read函数如下所示:

template <typename T>
inline void read(T &data) {
    baseStream.read((char *)&data, sizeof(T));
}

我想将其扩展为如下所示:

template <typename T>
inline void read(T &data, bool isBigEndian = false) {
    baseStream.read((char *)&data, sizeof(T));
    if (isBigEndian) {
        smallToBigEndian(data);
    }
}

对于smallToBigEndian,我想使用类似

的方法
template <typename T>
void smallToBigEndian(T &numericData) {
    char arr[sizeof(T)] = (char*)numericData;
    std::reverse(std::begin(arr), std::end(arr));
}

但这不起作用。它告诉我我无法将char*转换为char[sizeOfType],例如char*char[2]的{​​{1}}。

如何翻转存储在内存中的类型的字节?我该如何使编译器相信要在内存中键入的指针是一个具有类型大小的数组?

1 个答案:

答案 0 :(得分:-3)

最好通过使用按位运算来做到这一点,而不必依赖于主机字节顺序的显式知识。序列化库可以方便地处理此问题。除了字节顺序,还可能出现符号格式和填充字节之类的问题。

无耻的广告:我写了一个library,它是在独立于平台且定义明确的问题中做到这一点的。