基于Lua5.3
function crc16(buf,len)
local init = 0xFFFF;
local poly = 0xA001;
local ret = init;
local byte=0;
for j=1,len,1 do
byte = string.byte(buf,j);
ret=((ret ~ byte) & 0xFFFF);
for i=1,8,1 do
if((ret & 0x0001)>0) then
ret = (ret >> 1);
ret = ((ret ~ poly) & 0xFFFF);
else
ret= (ret >> 1);
end;
end
end
local hi = ((ret >> 8) & 0xFF);
local lo = (ret & 0xFF);
ret = ((lo << 8) | hi);
return ret;
end
使用方法:
local data = string.pack("BBBBBB", 0x01, 0x03, 0x00, 0x00, 0x00, 0x02); --需要校验CRC16的内容
local datacrc = crc16(data,6);
print( datacrc >> 8 ) --输出196 == 0xC4
print( datacrc & 0xFF ) --输出11 == 0x0B
检查正确性