Я предоставляю два решения.
- Решение 1 : без битовых операций Lua. Это медленно, но не требует никакой внешней библиотеки lua и файлов .so или .dll.
- Решение 2 : Производительность очень хорошая, когда вы вызываете эти функции очень часто. Выполнение операций над числами на битовом уровне очень и очень быстро.
Решение 1:
function ip2dec(ip) local i, dec = 3, 0; for d in string.gmatch(ip, "%d+") do dec = dec + 2 ^ (8 * i) * d; i = i - 1 end; return dec end
function dec2ip(decip) local divisor, quotient, ip; for i = 3, 0, -1 do divisor = 2 ^ (i * 8); quotient, decip = math.floor(decip / divisor), math.fmod(decip, divisor); if nil == ip then ip = quotient else ip = ip .. "." .. quotient end end return ip end
Решение 2:
http://bitop.luajit.org/install.html
http://bitop.luajit.org/download.html
https://github.com/fengpeiyuan/ipconv
package.path = package.path .. ";/home/balaji/lualib/bitopt.lua"
package.cpath = package.cpath .. ";/home/balaji/lualib/bit.so"
local bit = require("bitopt")
function dec2ip(dec) return bit:band(bit:rshift(dec, 24), 0xFF) .. "." .. bit:band(bit:rshift(dec, 16), 0xFF) .. "." .. bit:band(bit:rshift(dec, 8), 0xFF) .. "." .. bit:band(dec, 0xFF) end
function ip2dec(ip) local dec = 0; for d in string.gmatch(ip, "%d+") do dec = d + bit:lshift(dec, 8) end; return dec end