LUA没找到位运算,网上找了了一段,发现有问题经过修改测试如下:
CRC里的位运算搞定
local function BitOR(a,b)–Bitwise or
local p,c=1,0
while a+b>0 do
local ra,rb=a%2,b%2
if ra+rb>0 then c=c+p end
a,b,p=(a-ra)/2,(b-rb)/2,p2
end
return c
end
local function BitXOR(a,b)–Bitwise or
local p,c=1,0
while a+b>0 do
local ra,rb=a%2,b%2
if ra~=rb then c=c+p end
a,b,p=(a-ra)/2,(b-rb)/2,p2
end
return c
end
local function BitNOT(n,bit)
local p,c=1,0
while bit>0 do
local r=n%2
if (r==0) then c=c+p end
n,p=(n-r)/2,p*2
bit=bit-1
end
return c
end
local function BitAND(a,b)–Bitwise and
local p,c=1,0
while a>0 and b>0 do
local ra,rb=a%2,b%2
if ra+rb>1 then c=c+p end
a,b,p=(a-ra)/2,(b-rb)/2,p*2
end
return c
end
function crc16(buf,len)
–local poly = 0xA001;
local h = 0xffff
local lsb = 0
--local byte=0;
for j=1,len,1 do
--h ^= *puchMsg;
if(string.byte(buf,j) ==0x03) then
print("(string.byte(buf,j) ==0x03)")
end
h =BitXOR(h,string.byte(buf,j))
for i=1,8,1 do
--lsb = h & 0x0001; //取CRC的移出位
lsb = BitAND(h,0x0001)
--h >>= 1;
h=(h-lsb)/2
--if (lsb == 1)
--{
--h ^= 0x8408;
--}
if(lsb==1) then
h=BitXOR(h,0x8408)
end
end
end
--h ^= 0xffff;
h=BitAND(h,0xffff)
h=BitXOR(h,0xffff)
ret = h
--crc16_h = (uchar)(h>>8);
--hi=BitAND(h/(2^8),0xff)
--crc16_l = (uchar)(h);
--lo=BitAND(h,0xff)
--print(hi)
--print(lo)
--print(string.char(lo))
--ret = BitOR((hi*(2^8)),lo)
return ret
end