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)
---output 33:3C:DE:FA:BC:DE
--- Desired Output 12:3C:DE:FA:BC:DE

我用 *+. 尝试了多种模式,但都没有奏效。

解决方法

for w in string.gfind(idNumbers[3],"(%d)") do
      print(w)
str = string.gsub(MacFormat[3],"0",tonumber(w))
    end
print(str)

你的循环体相当于

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

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

MacFormat[3] 永远不会改变,gsub 的结果在每一行都被覆盖。

,

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

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

参见online Lua demo

模式为 "^" .. ("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

请参阅此处的 full demo