Delphi到Qt/C++:t内存流
Delphi to 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);
似乎长篇大论,不雅。。。当然我是C++的新手。
所以我的问题是,首先是否存在德尔福的时间流的直接等价物。阅读Qt?
有没有更好的方法可以像Delphi代码(变量h1)中那样,将一系列字节提取成一个长/整数?
实际上他们都错了。问题是字节序之一。读取整数时,应注意文件的字节序。
在十六进制编辑器中打开文件,查看遇到问题的整数。如果最低有效字节是第一个,则它是小端序。如果最高有效字节位于第一位,则为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();
当然,您可以通过将文件的大块读取到数组中并从数组中解码而不是逐字节读取文件来加快速度。
希望这能有所帮助。
Duthomas在endian问题上是正确的。您必须知道文件的格式才能正确读取。
要回答问题的另一部分,您需要使用Qt的QIOStream类,以便在更精细的级别访问文件。您还可以告诉QUIStream文件的endian格式,它会为您修复数字。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存