delphi - 如何使用 TFileStream 将二维矩阵读入动态数组?

标签 delphi

我需要使用 Delphi 2010 将一个大型 (2000x2000) 二进制数据矩阵从文件读取到动态数组中。直到运行时我才知道尺寸。

我从未读过这样的原始数据,也不了解 IEEE,所以我发布此内容是为了看看我是否走上正轨。

我计划使用 TFileStream 一次读取一行。

我需要能够阅读尽可能多的这些格式:

 16-bit two's complement binary integer
 32-bit two's complement binary integer
 64-bit two's complement binary integer
 IEEE single precision floating-point

对于 32 位二进制补码,我正在考虑类似于下面的代码。更改为 Int64 和 Int16 应该很简单。我如何阅读 IEEE?

我走在正确的道路上吗?对此代码有什么建议,或者如何优雅地将其扩展为上述所有 4 种数据类型?由于读取这些数据后我的后处理将是相同的,因此我想完成后我必须将矩阵复制为通用格式。

我没有问题,只是有四个过程(每种数据类型一个),如下所示,但也许有一种优雅的方法来使用 RTTI 或缓冲区,然后 move() ,以便相同的代码适用于所有 4 个过程数据类型?

谢谢!

  type
    TRowData = array of Int32;

   procedure ReadMatrix;
   var
     Matrix: array of TRowData;
     NumberOfRows: Cardinal;
     NumberOfCols: Cardinal;
     CurRow: Integer;
   begin
     NumberOfRows := 20; // not known until run time
     NumberOfCols := 100; // not known until run time
     SetLength(Matrix, NumberOfRows);
     for CurRow := 0 to NumberOfRows do
       begin
         SetLength(Matrix[CurRow], NumberOfCols);
         FileStream.ReadBuffer(Matrix[CurRow], NumberOfCols * SizeOf(Int32)) );
       end;
   end;

最佳答案

不,据我所知,无法使用 RTTI 来设置多维数组。但如果您使用的是 Delphi 2010,您应该能够使用泛型,如下所示:

type
  TRowData<T> = array of T;

 procedure ReadMatrix<T>;
 var
   Matrix: array of TRowData<T>;
   NumberOfRows: Cardinal;
   NumberOfCols: Cardinal;
   CurRow: Integer;
 begin
   NumberOfRows := 20; // not known until run time
   NumberOfCols := 100; // not known until run time
   SetLength(Matrix, NumberOfRows, NumberOfCols);
   for CurRow := 0 to NumberOfRows do
     FileStream.ReadBuffer(Matrix[CurRow][0], NumberOfCols * SizeOf(T)) );
 end;

不过,这必须在一个类中,如 Delphi 2010 doesn't support standalone procedures with generic types 。设置完成后,您可以调用 TWhateverClass.ReadMatrix<integer> , TWhateverClass.ReadMatrix<int64> , TWhateverClass.ReadMatrix<single> ,等等。

此外,如果您有一个具有 X 维的多维数组,则可以将 X 长度参数传递给 SetLength,而不仅仅是一个。因此,只需调用 SetLength(Matrix, NumberOfRows, NumberOfCols) 即可在循环之外,而不是将每一行单独初始化为相同的宽度。

关于delphi - 如何使用 TFileStream 将二维矩阵读入动态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2878180/

相关文章:

delphi - 如何将数据从 TDataSet 移动到 TClientDataSet?我需要数据的 XML 表示

delphi - 如何在 Delphi 可执行文件中嵌入二进制文件并在运行时提取?

delphi - 在 TScrollBox 中的固定位置保留位图

delphi - XMLHTTP 和 "Access denied"错误

delphi - 如何在 Delphi 2007 应用程序中显示 Crystal XI 报告?

delphi - 我如何确定抽象方法是否已实现?

delphi - 如何在 AContext.Connection.Disconnect 之后阻止 TCPServer OnExecute 事件无限执行?

multithreading - 使用-DELPHI中的Indy组件(idTCPServer/idTCPClient)的单服务器与多客户端实时监视系统

delphi - delphi中的高阶过程

android - Delphi XE7 TBannerAd 未在 Android 上显示广告