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



我正在用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]unsigned short.

如何翻转存储在内存中的类型的字节?如何说服编译器在内存中键入的指针是具有类型大小的数组?

最好使用按位运算来执行此操作,而不依赖于对主机字节顺序的显式了解。这可以通过序列化库方便地处理。除了字节顺序,还可能存在符号格式和填充字节等问题。

无耻的广告:我写了一个库,在一个独立于平台和定义明确的事情中做到这一点。

最新更新