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

Posted

技术标签:

【中文标题】LUA:从给定的数值生成唯一的 Mac【英文标题】:LUA: Generating Unique Mac from given Number Value 【发布时间】:2021-09-25 07:59:35 【问题描述】:

我正在尝试根据给定的数值生成唯一的 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

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

【问题讨论】:

它在我的编译器中完美运行 你用的是什么版本的lua? 只有 5.3。这是截图drive.google.com/file/d/19rlLnGauBLnPCpO18BNosZs065ITbTNV/… @WiktorStribiżew string.gfind 在 Lua 5.1 中重命名为 string.gmatch,从 Lua 5.1 开始 string.gfind 为 nil,除非使用兼容性选项 LUA_COMPAT_GFIND 编译 【参考方案1】:
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 的结果会在每一行中被覆盖。

【讨论】:

【参考方案2】:

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

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。

【讨论】:

以上是关于LUA:从给定的数值生成唯一的 Mac的主要内容,如果未能解决你的问题,请参考以下文章

如何生成给定数值数组中不存在的数值?

lua中如何获取表里随机的数值?

生成具有给定(数值)分布的随机数

《Lua程序设计》之 数值

是否可以在不循环的情况下为 iSeries 表中的每一行生成唯一的数值?

从字符串中获取唯一的整数值