Lua實現截取字符串并打印返回的數組

function  StringSplit(input,parttern)
	
	input=tostring(input);
	parttern=tostring(parttern);
	if (parttern==" ") then return false end
	local pos,array=0,{}

	for st,ed in function() return string.find(input,parttern,pos,true) end do
		table.insert(array, string.sub(input,pos,st-1))
		pos=ed+1
	end
	table.insert(array, string.sub(input,pos))
	setmetatable(array,{__tostring=function (array)
		str=""
		for k,v in pairs(array) do
			str=str .. ' ' ..v
		end
		return str

	end})
	return array
end

如果原字符串需要以空格,換行,逗號分割也可以使用如下方法匹配

function string.splitMatch(input,parttern)
	array={}
	for word in string.gmatch(input, parttern) do
		table.insert(array,word)
	end
	return array
end	

 

<think>嗯,用户让我介绍一下这个Lua函数`crc.crc16(buffer)`,看起来是关于CRC16校验的实现。之前用户已经问过校验L和校验H的问题,所以可能他们现在在具体实现中遇到了问题,或者想了解这个函数的实现细节。 首先,我需要理解这个函数的代码结构。函数里用了两个变量crcHi和crcLo,初始都是0xff。然后计算长度时用buffer的长度减去CRC_LEN,这里CRC_LEN可能是0,所以长度就是整个buffer的长度。循环遍历buffer的每个字节,然后进行一些异或操作和查表操作,最后返回crcHi左移8位和crcLo组合的结果。 接下来,用户之前的提问是关于校验L和校验H的,可能这个函数正好是处理高低字节的CRC16计算。需要确认这个函数使用的是哪种CRC16算法,比如CRC16-CCITT,MODBUS等,不同的算法初始和多项式可能不同。这里初始是0xFFFF,合一些常见的CRC16标准。 然后注意到代码中有两个表_auchCRCHi和_auchCRCLo,这应该是预先生成的CRC高8位和低8位的查找表。用户可能需要确认这两个表是否正确,因为不同的多项式生成的表不同。如果表不对,整个CRC计算就会出错。 另外,代码中的循环是从1开始,到length为止,这可能是因为Lua字符串的索引是从1开始的。需要注意这一点,避免索引错误。循环内部的计算步骤是:用crcHi异或当前字节得到索引,然后用crcLo异或高8位表的,再取低8位,接着更新crcLo为低8位表的。这个过程可能合查表法计算CRC的步骤,但需要详细解释每一步的作用。 用户可能的问题可能包括:为什么初始是0xFF?为什么结果要左移8位组合?或者为什么他们的CRC计算结果和预期不。这时候需要检查初始、多项式、输入数据的处理顺序,以及查找表的正确性。 可能还需要提醒用户注意字节顺序(大端或小端),以及是否需要在计算后对结果进行取反或其他处理,不同的CRC标准可能有不同的后处理步骤。例如,有些CRC会异或一个固定,或者需要反转字节。 此外,用户可能在实际使用中遇到问题,比如返回的结果是否正确,或者如何调整这个函数以适应不同的CRC16变种。这时候需要说明如何修改初始、多项式或者查找表,以满足特定的需求。 最后,总结这个函数的工作流程,指出关键点,比如查表法加速计算、高低字节的处理,以及可能的常见错误点,帮助用户更好地理解和使用这个函数。</think>以下是您提供的Lua函数 `crc.crc16(buffer)` 的逐行解析及其工作原理说明: --- ### **函数功能** 这是一个基于**查表法**实现的 **CRC16 校验算法**,用于计算输入数据缓冲区 `buffer` 的 CRC16 校验。其核心是通过预定义的查找表 `_auchCRCHi` 和 `_auchCRCLo` 加速计算。 --- ### **代码逐行解析** ```lua function crc.crc16(buffer) local crcHi = 0xff; -- 初始化CRC高字节为0xFF(某些CRC标准初始为0xFFFF) local crcLo = 0xff; -- 初始化CRC低字节为0xFF local CRC_LEN = 0; -- 假设不需要排除校验字段本身(例如计算时不包含自身) local length = #buffer - CRC_LEN; -- 实际参与计算的数据长度 -- 遍历缓冲区中的每个字节 for i = 1, length, 1 do -- 计算查表索引:当前CRC高字节与数据字节异或 local crcIndex = crcHi ~ string.byte(buffer, i); -- 更新CRC高字节:原CRC低字节与查表结果异或,并取低8位 crcHi = (crcLo ~ _auchCRCHi[crcIndex + 1]) & 0xff; -- 更新CRC低字节:直接查表获取(注意Lua数组索引从1开始) crcLo = _auchCRCLo[crcIndex + 1]; end -- 合并高字节和低字节,返回完整的16位CRC return (crcHi << 8 | crcLo); end ``` --- ### **关键点说明** #### 1. **初始** - `crcHi` 和 `crcLo` 初始化为 `0xFF`,合并后初始CRC为 `0xFFFF`,合 **CRC16-CCITT**、**CRC16-MODBUS** 等常见标准的初始要求。 #### 2. **查表法优化** - **核心逻辑**:通过预先生成的 `_auchCRCHi` 和 `_auchCRCLo` 表(高8位和低8位查找表),将CRC计算分解为查表操作,显著提升计算速度。 - **查表索引**:`crcIndex = crcHi ~ dataByte`,通过当前CRC高字节与数据字节异或,确定查表位置。 #### 3. **更新规则** - **更新高字节**:`crcHi = (crcLo ~ _auchCRCHi[...]) & 0xFF` 将原CRC低字节与查表结果的高8位异或,并截取低8位。 - **更新低字节**:`crcLo` 直接取自低8位表。 #### 4. **结果合并** - 最终返回 `(crcHi << 8 | crcLo)`,将高低字节合并为16位校验(如 `0x3A4B`)。 --- ### **常见CRC16变种与适配** 该函数可能对应以下CRC16标准(需结合预定义表验证): 1. **CRC16-CCITT (XModem)** - 多项式:`0x1021`,初始:`0xFFFF`,结果不取反。 2. **CRC16-MODBUS** - 多项式:`0x8005`,初始:`0xFFFF`,结果异或 `0x0000`。 若需适配其他CRC标准,需修改: - **初始**(如 `0x0000` 或 `0x1D0F`) - **预生成的查找表**(由多项式决定) - **最终结果处理**(如异或操作或位反转)。 --- ### **示例验证** 假设输入数据为 `"123456789"`,预期CRC16-MODBUS结果为 `0x4B37`。 可通过以下步骤调试: 1. **检查初始**:确认初始为 `0xFFFF`。 2. **验证查找表**:核对 `_auchCRCHi` 和 `_auchCRCLo` 是否合目标多项式。 3. **逐字节跟踪**:打印循环中每一步的 `crcHi` 和 `crcLo`,对比中间结果。 --- ### **常见问题排查** 1. **计算结果错误**: - **原因**:查找表与多项式不匹配,或初始错误。 - **解决**:使用已知数据生成工具(如在线CRC计算器)对比中间。 2. **索引越界**: - **原因**:Lua表 `_auchCRCHi` 或 `_auchCRCLo` 长度不足(应为256项)。 - **解决**:确保 `crcIndex + 1` 不超过表长度。 3. **字节顺序问题**: - **现象**:高低字节顺序颠倒。 - **解决**:检查最终合并顺序 `(crcHi << 8 | crcLo)` 是否合协议要求。 --- ### **扩展建议** - **添加输入校验**:确保 `buffer` 非空且为字符串类型。 - **支持自定义初始**:通过参数传递 `initValue` 增强灵活性。 - **预生成查找表**:在代码中静态定义表(需根据目标多项式生成)。 若有具体协议或多项式要求,可进一步分析查找表内容!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值