读取一个用 bigendian 写的文件

Read a file written in bigendian

我的机器在小端工作。 我必须使用 C++ std::ios::binary 阅读一些具有大端编码的文件。有什么标准和快速的方法吗? 目前,在读取原始数据后,我执行以下操作:

(读双)

char raw [8];
double d = 0; //maybe initialization is not needed
file.read(raw,8); //4 for an int
for(int k = 0; k < 8; k++) {
    memcpy((void *)(((char *)(&d))+k), (const void *)(raw+j+7-k), 1);
}

(读取一个整数)

char raw [4];
file.read(raw,4); //4 for an int
int i = (raw[j] << 24) | (raw[j+1] << 16) | (raw[j+2] << 8) | raw[j+3];

使用htonlntohl('host to network long' and "network to host long")函数在主机和网络字节顺序之间进行转换。网络字节顺序是大端,并且在您的体系结构上,主机字节顺序是小端。

在进行这种位处理时,您还应该始终使用明确大小的无符号整数类型,而不是 int。您可以稍后 reinterpret_cast 到所需的数据类型,例如从 uint64_t 开始读入 double.

uint32_t little_endian_thing;
uint32_t big_endian_thing;
file.read(&big_endian_thing, sizeof(uint32_t));
little_endian_thing = ntohl(big_endian_thing);