读取一个用 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];
使用htonl
和ntohl
('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);
我的机器在小端工作。 我必须使用 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];
使用htonl
和ntohl
('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);