我有一些Delphi代码需要转换为Qt / C ++。
整个代码读取一个二进制数据文件,并提取数据的一部分。
Delphi代码按如下方式读取文件内容:
var
m1 tmemorystream;
h1 integer;
.
.
m1 := tmemorystream.Create;
m1.LoadFromFile(paramstr[1]);
m1.Read (h1, 2);
现在,如果文件中的前2个字节为“ 01 00”,则我希望h1为0x0100,但似乎是将其“向后读取”,因此h1中的值实际上是“ 00 01”,即0x1。
Qt中的等效项我必须读取文件:
QFile fileIn(iFile);
if (!fileIn.open(QIODevice::ReadOnly)) return;
QByteArray m1 = fileIn.readAll();
我如何像在Delphi代码中一样将前2个字节读入h1?Delphi似乎有一种方法可以指定一些要从流/字节数组读取为整数表示形式的字节,但这似乎是相反的。
我可以想到在Qt中达到相同结果的等效方法是:
QString tStg;
tStg.sprintf ( "0x%02x%02x", getUChar ( m1, 1), getUChar ( m1, 0) );
bool ok;
unsigned long h1;
h1 = tStg.toLong(&ok,16);
似乎long之以鼻,in昧。。。。我是C ++的新手。
所以我的问题是,首先有直接与Delphi的tmemeorystream等效的东西吗?
是否有更好的方法可以像Delphi代码(变量h1)那样将一定范围的字节提取为单精度long / integer?
他们俩都是错的,实际上。问题是字节序。读取整数时,应注意文件的字节序。
在十六进制编辑器中打开文件,然后查看遇到问题的整数。如果最低有效字节是第一个,则为little-endian。如果最高有效字节是第一个,则为big-endian。(是的,所有这些都参考《格列佛游记》。)
当您的C ++代码读取文件时,请确保知道如何修复它。在我看来,最好的方法是始终按字节读取并将值移位到适当的位置:
// little endian
int x = 0;
x = (unsigned char)f.get();
x |= (unsigned char)f.get() << 8;
x |= (unsigned char)f.get() << 16;
x |= (unsigned char)f.get() << 24;
// big endian
int x = 0;
x = (unsigned char)f.get();
x <<= 8; x |= (unsigned char)f.get();
x <<= 8; x |= (unsigned char)f.get();
x <<= 8; x |= (unsigned char)f.get();
当然,您可以通过将文件的大块读入数组并从数组解码而不是逐字节读取文件来加快处理速度。
希望这可以帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句