我的机器工作在小端。 我必须使用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];
答案 0 :(得分:1)
使用ntohl
和int
(&#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}}