当前位置:   article > 正文

Lua--CRC8/MAXIM校验_lua crc8校验和是怎么得出来的

lua crc8校验和是怎么得出来的

使用方法:(适用于lua5.3)

1,先创建一个xxx.c文件,写入下面代码

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <lua.h>
  4. #include <lauxlib.h>
  5. #include <lualib.h>
  6. unsigned char crc8(const unsigned char *ptr,unsigned char len)
  7. {
  8. unsigned char i;
  9. unsigned char crc = 0;
  10. while(len--!=0)
  11. {
  12. for(i = 1; i != 0; i *= 2){
  13. if((crc & 1) != 0){
  14. crc /= 2;
  15. crc ^= 0x8C;
  16. }else{
  17. crc /= 2;
  18. }
  19. if((*ptr & i) != 0){
  20. crc ^= 0x8C;
  21. }
  22. }
  23. ptr++;
  24. }
  25. return (crc);
  26. }
  27. int CRC8(lua_State *L)
  28. {
  29. int i = 0;
  30. const unsigned char *str = luaL_checkstring(L,1);/*取出LUA调用CRC8函数时传递的第1个参数*/
  31. int len = luaL_checknumber(L,2);/*取出LUA调用CRC8函数时传递的第2个参数*/
  32. unsigned char ret = crc8(str,len);
  33. lua_pushinteger(L,ret);/*CRC8函数在LUA中的返回值*/
  34. return 1;
  35. }
  36. static luaL_Reg crclibs[] = {
  37. {"CRC8",CRC8}, /*此处就是提供给LUA调用的函数数组,用于luaL_setfuncs()函数注册*/
  38. {NULL,NULL}
  39. };
  40. int luaopen_libcrc(lua_State* L)
  41. {
  42. /*步骤2生成的动态库的名称 要和 "luaopen_libcrc""libcrc" 这几个字符一样,不然会报错*/
  43. lua_newtable(L);
  44. /*注册数组crclibs 中的所有函数*/
  45. luaL_setfuncs(L,crclibs,0);
  46. return 1;
  47. }

2,编译上面代码生成lua使用的动态库

gcc -fPIC -shared xxx.c -o libcrc.so

 

3,测试使用该库

  1. local mylib = require("libcrc")
  2. local cmd = {0x55,0xAA,0x04,0x05}
  3. local str = ""
  4. local len = #cmd --表cmd的长度
  5. for i=1,len do
  6. str = str..string.format("%c",cmd[i])
  7. end
  8. local crc = mylib.CRC8(str,len) --由于未找到lua传递表到C 的函数,所以这里采用传递了字符串

4,lua脚本实现的crc8(需要lua5.3)

  1. function crc8(arr)
  2. local crc = 0
  3. local tmp = 0
  4. local n = 1
  5. local i = 1
  6. local len = #arr
  7. while len ~= 0 do
  8. i = 1
  9. repeat
  10. tmp = crc & 1
  11. if tmp ~= 0 then
  12. crc = math.modf(crc/2)
  13. crc = crc ~ 0x8c
  14. else
  15. crc = math.modf(crc/2)
  16. end
  17. tmp = arr[n]
  18. tmp = tmp & i
  19. if tmp ~= 0 then
  20. crc = crc ~ 0x8c
  21. end
  22. i = i * 2
  23. until(i == 256)
  24. n = n + 1
  25. len = len - 1
  26. end
  27. return crc
  28. end

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/112986
推荐阅读
相关标签
  

闽ICP备14008679号