我想读一个用QDataStream
编写的二进制文件,并在LittleEndian中使用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
写的二进制数据?
答案 0 :(得分: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不区分二进制文本和文本,但其他一些操作系统也是如此。