我有一个包含多个字节/字节数组的记录:
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;
我有一个这种类型的记录,我需要循环内部的字节(通过将每个字节添加到校验和来创建一个简单的校验和).有一种简单的方法可以在循环中执行此操作,还是需要单独检查记录中的每个元素?
解决方法
你可以这样做:
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如何影响内部记录布局,以防您希望将此方法用于其他类型的记录.