LUA:从给定的数字值生成唯一的 MAC

我正在尝试从给定的数字值生成唯一的 MAC id。数字的长度在1到5位之间。我已经将 MAC 表格格式化为从 MAC 的第一个值开始放置每个数字。

local MacFormat ={[1] = "0A:BC:DE:FA:BC:DE",[2] = "00:BC:DE:FA:BC:DE",[3] = "00:0C:DE:FA:BC:DE",[4] = "00:00:DE:FA:BC:DE",[5] = "00:00:0E:FA:BC:DE"}

local idNumbers = {[1] = "1",[2]="12",[3]="123",[4]="1234",[5]="12345"}

for w in string.gfind(idNumbers[3], "(%d)") do
      print(w)
str = string.gsub(MacFormat[3],"0",tonumber(w))
    end
print(str)
---输出33:3C:DE:FA:BC:DE
--- 期望输出12:3C:DE:FA:BC:DE

我已经尝试了多个模式,包括 *+.,但都不起作用。

点赞
用户2858170
用户2858170
对于idNumbers[3]中的数字,执行以下循环:
for w in string.gfind(idNumbers[3], "(%d)") do
      print(w)
end
将w替换为数字后,使用数字替换MacFormat[3]中的0:
str = string.gsub(MacFormat[3],"0",tonumber(w))
print(str)

你的循环主体和以下代码等效:

str = string.gsub("00:0C:DE:FA:BC:DE", "0",1)
str = string.gsub("00:0C:DE:FA:BC:DE", "0", 2)
str = string.gsub("00:0C:DE:FA:BC:DE", "0", 3)

所以str"33:3C:DE:FA:BC:DE"

MacFormat[3] 没有被更改过,而 gsub 的结果会在每一行重写。

2021-07-16 15:16:17
用户3832970
用户3832970

您可以动态构建模式和替换:

local MacFormat ={[1] = "0A:BC:DE:FA:BC:DE",[2] = "00:BC:DE:FA:BC:DE",[3] = "00:0C:DE:FA:BC:DE",[4] = "00:00:DE:FA:BC:DE",[5] = "00:00:0E:FA:BC:DE"}
local idNumbers = {[1] = "1",[2]="12",[3]="123",[4]="1234",[5]="12345"}

local p = "^" .. ("0"):rep(string.len(idNumbers[3])):gsub("(..)", "%1:")
local repl = idNumbers[3]:gsub("(..)", "%1:")
local str = MacFormat[3]:gsub(p, repl)

print(str)
-- => 12:3C:DE:FA:BC:DE

参见 在线 Lua 演示

该模式是 "^" .. ("0"):rep(string.len(idNumbers[3])):gsub("(..)", "%1:")^ 匹配字符串开始,然后是一串零(与 idNumbers 大小相同,参见 ("0"):rep(string.len(idNumbers[3])))跟随每对零后面都有一个 ::gsub("(..)", "%1:"))。

替换是 idNumbers 项,并在每个第二个字符后插入一个冒号,使用 idNumbers[3]:gsub("(..)", "%1:")

在这种情况下,模式将是 ^00:0,替换将是 12:3

在这里查看 完整演示

2021-07-16 15:28:56