【问题标题】:Delphi to Qt/C++ : tmemorystreamDelphi 到 Qt/C++ : tmemorystream
【发布时间】:2015-11-08 19:49:50
【问题描述】:

我有一些 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)那样将一系列字节提取到一个长整型/整数中?

【问题讨论】:

    标签: c++ qt delphi


    【解决方案1】:

    事实上,他们都错了。问题是 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();
    

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

    希望这会有所帮助。

    【讨论】:

    • 谢谢D,这对我有很大帮助。我曾考虑编写一个函数,给它一个位置和长度并返回整数。我将使用位移来达到预期的效果。
    【解决方案2】:

    杜托马斯关于字节序问题是正确的。您必须知道文件的格式才能正确读取。

    要回答您问题的另一部分,您需要使用 Qt 的 QIOStream 类以更精细地访问文件。您还可以告诉 QUIStream 文件具有哪种字节序格式,它会为您修复数字。

    【讨论】:

    • 谢谢约翰。我会注意到这一点,因为当我在第一次重写代码后可能会重构代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多