我有一个包含多个字节/字节数组的记录:
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;
我有一个这种类型的记录,我需要遍历内部的字节(通过将每个字节添加到校验和来创建一个简单的校验和)。有一种简单的方法可以在循环中执行此操作,还是需要单独检查记录中的每个元素?
答案 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;