将打包记录复制到 delphi 中的 TByteDynArray(西雅图 10 号)

Copying packed record to TByteDynArray in delphi (10 Seattle)

我需要在 Delphi 中复制一个 packed recordTByteDynArray

PMyRec = ^TMyRec;
TMyRec = packed record
  Header: THeaderRec;
  Timestamp: TTimeStamp;   // time of event
  PLoc: TLocationRec;
  A: word;
end;

下面是我的代码片段。

  xxx: TByteDynArray;
  m_arr : TMyRec;

  SetLength(xxx,sizeof(TMyRec));

  offset := offset + sizeof(THeaderRec);
  System.Move(xxx[offset], m_arr.Timestamp ,sizeof(TTimeStamp));

  offset := offset + sizeof(TTimeStamp);
  System.Move(xxx[offset], m_arr.PLoc,sizeof(TLocationRec));

这似乎无法正确进行复制。有人可以指出我是否做错了什么吗?

如果你想复制 FROM 记录 TO 字节数组,那么你的代码正在做相反的事情。注意System.Move()的参数。它的第一个参数是 Source,它的第二个参数是 Destination。这不同于其他 API,例如 memcpy()CopyMemory()

试试这个:

offset := 0;
System.Move(m_arr.Header, xxx[offset], sizeof(THeaderRec));

Inc(offset, sizeof(THeaderRec));
System.Move(m_arr.Timestamp, xxx[offset], sizeof(TTimeStamp));

Inc(offset, sizeof(TTimeStamp));
System.Move(m_arr.PLoc, xxx[offset], sizeof(TLocationRec));

Inc(offset, sizeof(TLocationRec));
System.Move(m_arr.A, xxx[offset], sizeof(Word));

或者,您可以一次性复制整条记录:

System.Move(m_arr, xxx[0], sizeof(TMyRec));

话虽如此,如果您需要按字段进行复制,我建议让编译器为您计算字段偏移量,例如:

offset := Integer(@PMyRec(nil).Header);
System.Move(m_arr.Header, xxx[offset], sizeof(THeaderRec));

offset := Integer(@PMyRec(nil).Timestamp);
System.Move(m_arr.Timestamp, xxx[offset], sizeof(TTimeStamp));

offset := Integer(@PMyRec(nil).PLoc);
System.Move(m_arr.PLoc, xxx[offset], sizeof(TLocationRec));

offset := Integer(@PMyRec(nil).A);
System.Move(m_arr.A, xxx[offset], sizeof(Word));

或者更好,根本不使用 Move()。您可以改为对分配的字节数组进行类型转换并使用标准字段分配,例如:

PMyRec(xxx)^.Header := m_arr.Header;
PMyRec(xxx)^.Timestamp := m_arr.Timestamp;
PMyRec(xxx)^.PLoc := m_arr.PLoc;
PMyRec(xxx)^.A := m_arr.A;

或者,复制整条记录:

PMyRec(xxx)^ := m_arr;