Lua--CRC8/MAXIM校验

本文详细介绍了如何使用Lua5.3与C语言进行交互,实现CRC8校验函数。通过创建并编译C源文件,生成Lua可调用的动态库,演示了从C函数注册到Lua环境中,再到Lua脚本调用C函数的全过程。同时,提供了纯Lua实现的CRC8算法作为对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

unsigned char crc8(const unsigned char *ptr,unsigned char len)
{
    unsigned char i;
    unsigned char crc = 0;
    while(len--!=0)
    {
        for(i = 1; i != 0; i *= 2){
            if((crc & 1) != 0){
                crc /= 2;
                crc ^= 0x8C;
            }else{
                crc /= 2;
            }
            if((*ptr & i) != 0){
                crc ^= 0x8C;
            }
        }
        ptr++;
    }
    return (crc);
}

int CRC8(lua_State *L)
{
    int i = 0;
    const unsigned char *str = luaL_checkstring(L,1);/*取出LUA调用CRC8函数时传递的第1个参数*/
    int len = luaL_checknumber(L,2);/*取出LUA调用CRC8函数时传递的第2个参数*/
    unsigned char ret = crc8(str,len);
    lua_pushinteger(L,ret);/*CRC8函数在LUA中的返回值*/
    return 1;
}

static luaL_Reg crclibs[] = {
    {"CRC8",CRC8}, /*此处就是提供给LUA调用的函数数组,用于luaL_setfuncs()函数注册*/
    {NULL,NULL}
};

int luaopen_libcrc(lua_State* L)
{
/*步骤2生成的动态库的名称 要和 "luaopen_libcrc" 中 "libcrc" 这几个字符一样,不然会报错*/
    lua_newtable(L);
/*注册数组crclibs 中的所有函数*/
    luaL_setfuncs(L,crclibs,0);
    return 1;
}

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

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

 

3,测试使用该库

local mylib = require("libcrc")

local cmd = {0x55,0xAA,0x04,0x05}

local str = ""

local len = #cmd  --表cmd的长度

for i=1,len do
    str = str..string.format("%c",cmd[i])
end

local crc = mylib.CRC8(str,len)  --由于未找到lua传递表到C 的函数,所以这里采用传递了字符串

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

function crc8(arr)
	local crc = 0
	local tmp = 0
	local n = 1
	local i = 1
	local len = #arr
	while len ~= 0 do
		i = 1
		repeat
			tmp = crc & 1
			if tmp ~= 0 then
				crc = math.modf(crc/2)
				crc = crc ~ 0x8c
			else 
				crc = math.modf(crc/2)
			end
			tmp = arr[n]
			tmp = tmp & i
			if tmp ~= 0 then
				crc = crc ~ 0x8c
			end
			i = i * 2	
		until(i == 256)
		n = n + 1
		len = len - 1
	end
	return crc
end

 

<think>嗯,用户想了解如何通过执行给定的命令来更新Lua的版本。首先,我需要分解每个步骤的作用,并检查潜在的问题。 用户提供的命令是: 1. `lua -v` 查看当前版本。 2. `rm -rf /usr/bin/lua` 删除旧的可执行文件。 3. `ln -s /root/lua-5.3.4/src/lua /usr/bin/lua` 创建符号链接到新版本。 4. 再次 `lua -v` 验证版本。 首先,需要注意`rm -rf`的使用,尤其是目标路径是否正确,否则可能误删系统文件。这里删除的是`/usr/bin/lua`,假设用户确实想替换这个位置的链接,但需要确认该路径是否确实存在旧的Lua可执行文件。 其次,符号链接的命令是否正确。新版本的路径是`/root/lua-5.3.4/src/lua`,需要确保该路径存在且可执行。如果用户自己编译了Lua 5.3.4并安装到了该目录,那么没问题。否则,链接可能指向错误的位置,导致命令无法执行。 另外,权限问题可能也是一个考虑因素。执行`rm`和`ln`可能需要sudo权限,如果用户当前不是root,可能会遇到权限拒绝的错误。需要提醒用户必要时使用sudo。 还可能存在的风险包括:删除旧版本后,如果新版本的路径不正确,系统将无法找到Lua,导致依赖Lua的程序出现问题。需要建议用户先备份旧的可执行文件,或者确保新版本正确安装后再删除链接。 此外,用户可能没有正确编译新版本的Lua,导致`/root/lua-5.3.4/src/lua`不存在。需要确认编译步骤是否正确完成,或者是否应该将可执行文件安装到`/usr/local/bin`等标准位置。 总结可能的检查点:权限、路径正确性、新版本是否已正确安装、备份旧版本。</think>以下是对你提供的命令序列的分步解释及注意事项: $\textcolor{green}{步骤分析:}$ 1. $\texttt{lua -v}$ (原始版本确认) - 作用:查看当前系统默认Lua解释器版本 - 输出示例:`Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio` 2. $\texttt{rm -rf /usr/bin/lua}$ (删除旧版本链接) - ⚠️ 注意:此操作会强制删除系统默认Lua解释器的软链接 - 建议操作前确认路径:`which lua` - 高危操作建议:先备份 `sudo cp /usr/bin/lua /usr/bin/lua.bak` 3. $\texttt{ln -s /root/lua-5.3.4/src/lua /usr/bin/lua}$ (创建新版本链接) - 前提条件:必须已成功编译安装$\texttt{/root/lua-5.3.4}$目录中的Lua 5.3.4 - 验证新可执行文件存在:`ls -l /root/lua-5.3.4/src/lua` 4. $\texttt{lua -v}$ (验证新版本) - 预期输出:`Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio` $\textcolor{red}{常见问题及解决方案:}$ 1. **权限不足**: ```bash sudo ln -s /root/lua-5.3.4/src/lua /usr/bin/lua ``` 2. **符号链接失效**: ```bash # 检查链接有效性 file /usr/bin/lua # 应显示:"/usr/bin/lua: symbolic link to /root/lua-5.3.4/src/lua" ``` 3. **版本未更新**: ```bash # 检查实际调用的可执行文件路径 which lua hash -r # 清除缓存路径 ``` $\textcolor{blue}{推荐的安全升级方式:}$ ```bash # 使用包管理器优先(如适用) sudo apt-get install lua5.3 # 或通过源码规范安装 cd /root/lua-5.3.4 make linux test # 不同系统需替换为make posix/macosx等 sudo make install ``` $\textcolor{purple}{版本兼容性注意事项:}$ - Lua 5.3.x 与 5.1.x 存在不兼容语法变更 - 建议使用$\texttt{luav}$工具管理多版本共存 - 重要程序依赖旧版本时,可使用: ```bash # 创建版本化别名 sudo ln -s /usr/bin/lua /usr/bin/lua5.1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值