IdUdpClient如何接受动态数组中的数据

时间:2019-02-26 17:04:00

标签: delphi udp client firemonkey indy

此代码接受静态数组中的数据。

TMyRec = record
   MyArray: array[0..1, 0..10] of double;
end;

MyClient: TIdUDPClient;
MyRec: TMyRec;
Buffer: TIdBytes;

SetLength(Buffer, SizeOf(MyRec));
if MyClient.ReceiveBuffer(Buffer, 1) > 0 then
begin
     BytesToRaw(Buffer, MyRec, SizeOf(MyRec));
end;

以及如何在动态数组中实现。

TMyRec = record
   MyArray: array of array of double;
end;

1 个答案:

答案 0 :(得分:1)

首先,您要为Buffer字节分配SizeOf(MyRec)(对于静态数组版本为176),但是随后您仅从UDP套接字读取1个字节。您需要用SizeOf(MyRec)Length(Buffer)代替1,以匹配分配。

话虽这么说,array of array of ...并不存储在一个连续内存块中。它实际上是指向分散在内存中的其他数组的指针数组。因此,要执行您要的操作,您将必须执行以下操作:

type
  TMyRec = record
    MyArray: array of array of double;
  end;

const
  BytesPerArr = SizeOf(Double) * 11;

var
  MyClient: TIdUDPClient;
  MyRec: TMyRec;
  Buffer: TIdBytes;

...

SetLength(MyRec.MyArray, 2, 11);
SetLength(Buffer, 2 * BytesPerArr);

if MyClient.ReceiveBuffer(Buffer, Length(Buffer)) > 0 then
begin
  Move(Buffer[0], MyRec.MyArray[0][0], BytesPerArr);
  Move(Buffer[BytesPerArr], MyRec.MyArray[1][0], BytesPerArr);
end;