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

时间:2016-09-28 03:02:46

标签: delphi delphi-xe2

我需要在Delphi中将packed record复制到TByteDynArray

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));

这在某种程度上似乎没有正确地进行复制。有人可以指出我做错了吗?

1 个答案:

答案 0 :(得分:2)

如果您想要复制 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;