我正在尝试从C中的二进制文件中读取一个长的(带符号的,4个字节) . 我主要担心的是:可移植性(不同平台上的longs是不同的大小),当你从二进制文件中读取w / std :: ifstream时,它会颠倒字节顺序(到我的机器的字节顺序) .
我理解像unsigned int这样的数据类型,你可以简单地使用按位运算符并移位和AND每个字节在从文件读取后反转字节顺序 .
我只是不确定我会为此做些什么:目前我的代码会给出一个无意义的值:
long value;
in.seekg(0x3c);
in.read(reinterpret_cast<char*>(&value), sizeof(long));
我不确定如何实现可移植性(我读了一些关于联合和char *的东西)并且还反转了它读入的签名长度 .
谢谢 .
3 回答
而不是使用
long
,而是使用<stdint.h>
中的int32_t
来直接指定32位整数 . (或uint32_t
表示无符号) .根据需要使用htonl and ntohl来获取/来自网络字节顺序 .
更好:
我建议你使用像htonl,htnons,ntohl和ntohs这样的函数 . 这些用于网络编程以实现同样的目标:可移植性和字节序的独立性 .
由于跨平台支持对您很重要,我建议使用cstdint来指定类型的大小 . 你可以说
int32_t x
(例如)并知道你得到32位数据 .关于数据的字节顺序,我建议对格式进行标准化(例如,所有数据都以小端格式编写),并将I / O操作包装在一个类中,并使用它来读/写数据 . 然后使用
#define
来决定如何读取数据:或者你可以看一下像Google Protobuf这样的东西,它将为你处理所有的编码问题 .