gpt4 book ai didi

c++ - 德尔福到 Qt/C++ : tmemorystream

转载 作者:行者123 更新时间:2023-11-30 01:46:11 33 4
gpt4 key购买 nike

我有一些 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);

看起来冗长且不雅...当然我是 C++ 的新手。

所以我的问题首先是在 Qt 中是否有直接等效于 Delphi 的 tmemeorystream.Read 的东西?

是否有更好的方法将一系列字节提取为单个长整数/整数,就像在 Delphi 代码(变量 h1)中一样?

最佳答案

事实上,他们都错了。问题是 endianness 之一。当您读取一个整数时,您应该注意文件 的字节顺序。

在十六进制编辑器中打开您的文件并查看遇到问题的整数。如果最低有效字节在前,则为 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();

当然,您可以通过将大块文件读入数组并从数组解码而不是逐字节读取文件来加快速度。

希望这对您有所帮助。

关于c++ - 德尔福到 Qt/C++ : tmemorystream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33598281/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com