阅读用bigendian编写的文件

时间:2016-09-17 12:44:04

标签: c++ binaryfiles endianness

我的机器工作在小端。 我必须使用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];

1 个答案:

答案 0 :(得分:1)

使用ntohlint(&#39;主机网络长&#34;和#34;网络托管长&#34;)功能在主机和网络字节顺序之间进行转换。网络字节顺序是大端,在您的架构上,主机字节顺序是小端。

在执行此类位错误时,您还应始终使用显式大小的无符号整数类型,而不是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);

{{1}}