Delphi到Qt / C ++:tmemorystream

腾讯

我有一些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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从TMemorystream读取的delphi而不改变位置

来自分类Dev

从清单框到tcxchecklistbox(将状态保存到TMemoryStream)

来自分类Dev

C ++到delphi转换

来自分类Dev

如何从TFileStream和TMemoryStream继承?

来自分类Dev

C ++到Delphi dll调用

来自分类Dev

从C ++到Delphi的类型转换

来自分类Dev

Delphi到C#的转换

来自分类Dev

读取TMemoryStream时发生访问冲突错误

来自分类Dev

如何使用TMemoryStream连接字符串

来自分类Dev

无法使用TMemoryStream读取布尔值

来自分类Dev

delphi到C ++构建器的转换

来自分类Dev

C#Struct到delphi打包记录

来自分类Dev

C ++结构到Delphi Record dll调用

来自分类Dev

从C#到Delphi整理多维数组

来自分类Dev

C#Struct到delphi打包记录

来自分类Dev

Delphi 到 C++ 的翻译问题

来自分类Dev

从C ++ DLL到Delphi:如何将指向数据的指针从C ++ DLL传递到Delphi程序?

来自分类Dev

Qt C ++ QString到QByteArray的转换

来自分类Dev

从QJsonValue到QByteArray的Qt C ++转换

来自分类Dev

如何使用 JBitmap/JBitmapFactory 解码 TMemoryStream 中的 PNG 图像

来自分类Dev

从Delphi到C#WinForms:在表单上遍历表单组件

来自分类Dev

C ++到Delphi Header文件的转换:指向void的函数

来自分类Dev

将结构数组从C#传递到Delphi

来自分类Dev

将var字符串从C ++传递到Delphi dll

来自分类Dev

从C#移植到Delphi,Regex不兼容

来自分类Dev

将var字符串从C ++传递到Delphi dll

来自分类Dev

从外部发送消息到C ++ / Qt应用程序?

来自分类Dev

C++ QT Casting 到 QList 中项目的子类

来自分类Dev

现代Delphi到C字符串以传递给C DLL