我需要使用 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/