将打包记录复制到 delphi 中的 TByteDynArray(西雅图 10 号)
Copying packed record to TByteDynArray in delphi (10 Seattle)
我需要在 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));
这似乎无法正确进行复制。有人可以指出我是否做错了什么吗?
如果你想复制 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;
我需要在 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));
这似乎无法正确进行复制。有人可以指出我是否做错了什么吗?
如果你想复制 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;