CRC-CCITT

<< Click to Display Table of Contents >>

Navigation:  Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Примеры и полезности > Примеры расчета контрольных сумм >

CRC-CCITT

CRC-CCITT - контрольная сумма "циклический избыточный код" (википедия:циклический избыточный код). Различные вариации данного метода подсчета контрольной суммы являются наиболее распространенными в промышленных протокола. Ниже приводится два варианта подсчета контрольной суммы - CRC-CCITT Modbus и CRC-CCITT XModem.

Контрольная сумма CRC-CCITT Modbus

function ModbusCRC(ArrayByte)

local crc=0xFFFF;

   for i=1,table.maxn(ArrayByte),1 do

       crc=bit.BitXor(crc,ArrayByte[i]);

       for j=0,7,1 do

           if bit.BitAnd(crc,0x1)~=0 then

               crc=bit.BitRshift(crc,1);

               crc=bit.BitXor(crc,0xA001);

           else

               crc=bit.BitRshift(crc,1);

           end;

       end;

   end;

  --меняем байты местами

   byte1=bit.BitAnd( bit.BitLshift(crc,8),0xFFFF);

   byte2=bit.BitRshift(crc,8);

   return bit.BitOr(byte1,byte2 );    

end;

Пример использования.

local Array={0x01,0x03,0x00,0x00,0x00,0x01};

local CRC=ModbusCRC(Array);

--CRC=0x840A

 

Контрольная сумма CRC-CCITT Xmodem

function XModemCRC(ArrayByte)

   len=table.maxn( ArrayByte);

   local crc = 0x0;    

   for j=1,len,1 do            

       local z=bit.BitAnd(bit.BitLshift(ArrayByte[j],8),0xFFFF);

       crc = bit.BitXor(crc,z);            

       for i = 0, 7, 1 do            

           if bit.BitAnd(crc,0x8000)>0 then

               local k=bit.BitAnd(bit.BitLshift(crc,1),0xFFFF);

               crc=bit.BitXor(k,0x1021);

           else

               crc=bit.BitAnd(bit.BitLshift(crc,1),0xFFFF);

           end;

       end;

   end;

   return crc;

end;

Пример использования.

local Array={0x3F,0x02,0x01,0x23,0x45,0x67};

local CRC=XModemCRC(Array);

--CRC=E956