Delphi:循环记录中的字节

时间:2013-02-11 09:45:33

标签: delphi loops record delphi-xe3

我有一个包含多个字节/字节数组的记录:

  type
   TRdmPacket = record
    sc: byte;
    subSc: byte;
    msgLength: byte;
    destUID: array[0..5] of byte;
    srcUID: array[0..5] of byte;
    transNum: byte;
    portID: byte;
    msgCount: byte;
    subDevice: array[0..1] of byte;
    cc: byte;
    pid: array[0..1] of byte;
    pdl: byte;
  end;

我有一个这种类型的记录,我需要遍历内部的字节(通过将每个字节添加到校验和来创建一个简单的校验和)。有一种简单的方法可以在循环中执行此操作,还是需要单独检查记录中的每个元素?

2 个答案:

答案 0 :(得分:8)

您可以执行以下操作:

var
  sum: Byte;
  ptr: PByte;
  i: Integer;
begin
  sum := 0;
  ptr := PByte(@rdmPacket);

  for i := 0 to SizeOf(TRdmPacket) - 1 do
  begin
    sum := sum xor ptr^;
    Inc(ptr);
  end;
end;

在这种特殊情况下,它将正常工作,因为TRdmPacket中的所有字段都是字节或字节数组,并且它们没有对齐。进一步阅读Packed$Align directive如何影响内部记录布局,以防您希望将此方法用于其他类型的记录。

答案 1 :(得分:2)

您可以使用此

的绝对指令
type
   TRdmPacket = record
    sc: byte;
    subSc: byte;
    msgLength: byte;
    destUID: array[0..5] of byte;
    srcUID: array[0..5] of byte;
    transNum: byte;
    portID: byte;
    msgCount: byte;
    subDevice: array[0..1] of byte;
    cc: byte;
    pid: array[0..1] of byte;
    pdl: byte;
  end;

Function GetPackChecksum( pack:TRdmPacket):Integer;
var
 BArray:Array [0..SizeOf(TRdmPacket) - 1] of Byte absolute pack;
 i:Integer;
begin
 Result := 0;
 for I := Low (BArray)to High(BArray) do
    begin
      Result := Result +  BArray[i];
    end;

end;

procedure TForm2.Button1Click(Sender: TObject);
var
 pack:TRdmPacket;
begin
  ZeroMemory(@pack,SizeOf(Pack));
  pack.sc := 100;
  pack.destUID[1] := 123;
  Showmessage(IntToStr(GetPackChecksum(pack)));
end;