好吧,我可能会读入一个使用更合适的类型声明的缓冲区。
例如,假设您的数据是 16 位整数,Smallint
在 Delphi 中。然后声明一个动态数组Smallint
。
var
buf: array of Smallint;
然后为数据分配足够的空间:
Assert(ckiData.cksize mod SizeOf(buf[0])=0);
SetLength(buf, ckiData.cksize div SizeOf(buf[0]));
然后读取缓冲区:
mmioRead(HMMIO, PAnsiChar(buf), ckiData.cksize);
现在您可以将元素作为Smallint
值访问。
如果您有不同的元素类型,那么您可以调整您的数组声明。如果您直到运行时才知道元素类型是什么,那么您最好array of Byte
使用指针算术和强制转换来访问实际内容。
我会说界面的设计mmioRead
有点弱。缓冲区并不是真正的字符串。最好将其视为字节数组。但也许是因为 C 没有单独的字节和字符类型,函数被声明为采用指向 char 数组的指针。实际上,Delphi 翻译会更好地公开指向字节的指针,或者在我看来甚至更好,即普通的无类型Pointer
类型。
我假设您正在努力解释的输出,mmioRead
因为那是您在问题中包含的代码。但是,根据现在已删除的评论,您的问题是 GUI 问题。
您想向备忘录添加内容。像这样做:
Memo1.Clear;
for i := low(buf) to high(buf) do
Memo1.Items.Add(IntToStr(buf[i]));
如果要转换为浮点数,仍然假设 16 位有符号数据,请执行以下操作:
Memo1.Clear;
for i := low(buf) to high(buf) do
Memo1.Items.Add(FormatFloat('0.00000', buf[i]/32768.0));//show 5dp