Підрахунок crc методом xor

підрахунок CRC методом XOR

Є залізяка з якою я намагаюся спілкуватися. Посилаю йому ось таку структуру:
# XA0; TTRKMsg = record
# XA0; Sbyte. Byte;
# XA0; device_no. array [0..1] of char;
# XA0; Command. char;
# XA0; SBuffer. Byte;
# XA0; a. array [0..5] of Char;
# XA0; b. array [0..5] of char;
# XA0; Error. array [0..1] of char;
# XA0; Request. array [0..1] of char;
# XA0; EBuffer. Byte;
# XA0; CRC. Byte;

type
# XA0; tBytes = array [0..23] of byte;
# XA0; pBytes = ^ tBytes;

function CalcCRC (xBuff: TTRKMsg): byte;
var P: pBytes;
# XA0; # XA0; i: byte;
begin
# XA0; P: = @ xBuff;
# XA0; Result: = 0;
# XA0; for i: = 1 to sizeOf (xBuff) -1 do begin
# XA0; # XA0; Result: = Result xor P ^ [i];
# XA0; end;
end;

Приходить відповідь: пристрій мені повідомляє, що ні вірна сума CRC. Подивіться, може чого я не правильно роблю, плз.

доповнення:
стартовий біт не повинен вважатися при підрахунку контрольної суми, тобто
Sbyte. Byte; не повинен враховуватися при підрахунку

>> я зробив i: = 0 тому, що перший біт - стартовий, а він, як я писав вище, не бере участь при постчете.

TTRKMsg = packed record
.

var P: PByteArray;
# XA0; i: byte;
begin
P: = @ xBuff;
Result: = 0;
for i: = 1 to sizeOf (TTRKMsg) - 2 do begin // 2 -поскольку поле CRC, вважаю, враховувати не треба
# XA0; Result: = Result xor P ^ [i];
end;

Логічно, CRC рахувати не є резонно, але знову ж ось витяг:
"Підрахунок байта контрольної суми повідомлення (поле CRC) проводиться шляхом виконання операції XOR (ісключаещее або) всіх байтів повідомлення, включаючи EBuffer, не включаючи SByte."

А якщо зробити цикл до SizeOf (TTrkMsg) -2, то залізяка взагалі відмовляється реагувати на полсанное їй повідомлення

а якщо з кінця почати? downto

>> Slym теж варіант, але.

ось я тут перед тим як вважати CRC, в структурі "обнулив" його, тобто

Msg.CRC: = 0;
Msg.CRC: = CalcCRC (MSG);

Залізо припинило п'ять мені відповідати. щось я зовсім заплутався

цікаво. ось порахував crc, а потім записав його в структуру. Виходить, що цим ти її CRC змінив. Замкнуте коло, однако. Напевно, вона все-таки не повинна враховуватися

Щось я в твоїй структурі TTRKMsg нарахував всього 23 байта, а в

> TBytes = array [0..23] of byte;

24 байта!

оффтоп: що цікаво - ця фігня взагалі не має ніякого відношення до crc. % -)

в більшості випадків (в моїй практиці), CRC треба було ініціювати $ FF.

function CalcCRC (const xBuff: TTRKMsg): byte;
var __xBuff: array [byte] of byte absolute xBuff;
# XA0; # XA0; i: byte;
begin
# XA0; # XA0; Result: = $ FF;
# XA0; # XA0; for i: = sizeof (xBuff.Sbyte) to (sizeOf (xBuff) -1) -sizeof (xBuff.CRC) do begin
# XA0; # XA0; # XA0; # XA0; Result: = Result xor __xBuff [i];
# XA0; # XA0; end;
end;

Запису не упакована, звідси купа варіантів її заповнення, в залежності від версії Дельфі і налаштувань.
ShowMessage (IntToStr (SizeOf (TTRKMsg)))

Пам'ять: 0.74 MB
Час: 0.095 c

Схожі статті