我需要在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));
这在某种程度上似乎没有正确地进行复制。有人可以指出我做错了吗?
答案 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;