2

我想读取一个用 a 编写的二进制文件,QDataStream并在 LittleEndian 中用 a 编码std::fstream(在同一平台上,因此不关心具有不同格式的一种数据类型的问题)。

我怎样才能最好地做到这一点?据我所知,std::fstream没有内置功能来读取/写入 LittleEndian 数据。

我深入研究了问题并发现了以下内容(伪代码):

ofstream out;      //initialized to file1, ready to read/write
ifstream in;       //initialized to file2; ready to read/write
QDataStream q_out; //initialized to file2; ready to read/write

int a=5, b;
//write to file1
out << a; //stored as 0x 35 00 00 00. Curiously, 0x35 is the character '5' in ASCII-code
//write to file2
q_out << a; //stored as 0x 05 00 00 00

//read from file2 the value that was written by q_out
in >> b; //will NOT give the correct result

//read as raw data
char *c = new char[4];
in.read(c, 4);

unsigned char *dst = (unsigned char *)&b;
dst[3] = c[3];
dst[2] = c[2];
dst[1] = c[1];
dst[0] = c[0];
//b==5 now

总结一下:QDataStream以不同于std::fstream. QDataStream有没有一种简单的方法可以读取使用写入的二进制数据std::fstream

4

1 回答 1

2

假设你在一台 Little Endian 机器上,这很有可能,然后读取包含以下 int 的文件:

05 00 00 00

就像这样直截了当:

int32_t x;
in.read((char*)&x, sizeof(int32_t));
assert(x == 5);

还有一些注意事项:

  • 运算符>><<执行格式化 i/o,即它们将值转换为文本表示/从文本表示转换,这与您的情况无关。
  • ios_base::binary您应该以二进制模式(标志)打开文件。POSIX 不区分二进制和文本,但其他一些操作系统可以。
于 2013-02-07T09:57:15.490 回答