LUA:根据给定的数值生成唯一的 Mac
LUA: Generating Unique Mac from given Number Value
我正在尝试根据给定的数值生成唯一的 MAC ID。号码的长度在 1 到 5 位数字之间。我已将 MAC table 格式化为从 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
我尝试了 *
、+
、.
的多个模式,但 none 有效。
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", "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
的结果在每一行中都会被覆盖。
您可以动态构建模式和替换:
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
模式是 "^" .. ("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。
我正在尝试根据给定的数值生成唯一的 MAC ID。号码的长度在 1 到 5 位数字之间。我已将 MAC table 格式化为从 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
我尝试了 *
、+
、.
的多个模式,但 none 有效。
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", "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
的结果在每一行中都会被覆盖。
您可以动态构建模式和替换:
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
模式是 "^" .. ("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。