mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Scribunto
synced 2024-11-27 01:30:00 +00:00
95 lines
1.7 KiB
Lua
95 lines
1.7 KiB
Lua
|
--[[---------------
|
||
|
Hex v0.4
|
||
|
-------------------
|
||
|
Hex conversion lib for lua.
|
||
|
|
||
|
How to use:
|
||
|
hex.to_hex(n) -- convert a number to a hex string
|
||
|
hex.to_dec(hex) -- convert a hex string(prefix with '0x' or '0X') to number
|
||
|
|
||
|
Part of LuaBit(http://luaforge.net/projects/bit/).
|
||
|
|
||
|
Under the MIT license.
|
||
|
|
||
|
copyright(c) 2006~2007 hanzhao (abrash_han@hotmail.com)
|
||
|
--]]---------------
|
||
|
|
||
|
require 'bit'
|
||
|
|
||
|
do
|
||
|
|
||
|
local function to_hex(n)
|
||
|
if(type(n) ~= "number") then
|
||
|
error("non-number type passed in.")
|
||
|
end
|
||
|
|
||
|
-- checking not float
|
||
|
if(n - math.floor(n) > 0) then
|
||
|
error("trying to apply bitwise operation on non-integer!")
|
||
|
end
|
||
|
|
||
|
if(n < 0) then
|
||
|
-- negative
|
||
|
n = bit.tobits(bit.bnot(math.abs(n)) + 1)
|
||
|
n = bit.tonumb(n)
|
||
|
end
|
||
|
|
||
|
hex_tbl = {'A', 'B', 'C', 'D', 'E', 'F'}
|
||
|
hex_str = ""
|
||
|
|
||
|
while(n ~= 0) do
|
||
|
last = math.mod(n, 16)
|
||
|
if(last < 10) then
|
||
|
hex_str = tostring(last) .. hex_str
|
||
|
else
|
||
|
hex_str = hex_tbl[last-10+1] .. hex_str
|
||
|
end
|
||
|
n = math.floor(n/16)
|
||
|
end
|
||
|
if(hex_str == "") then
|
||
|
hex_str = "0"
|
||
|
end
|
||
|
return "0x" .. hex_str
|
||
|
end
|
||
|
|
||
|
local function to_dec(hex)
|
||
|
if(type(hex) ~= "string") then
|
||
|
error("non-string type passed in.")
|
||
|
end
|
||
|
|
||
|
head = string.sub(hex, 1, 2)
|
||
|
|
||
|
if( head ~= "0x" and head ~= "0X") then
|
||
|
error("wrong hex format, should lead by 0x or 0X.")
|
||
|
end
|
||
|
|
||
|
v = tonumber(string.sub(hex, 3), 16)
|
||
|
|
||
|
return v;
|
||
|
end
|
||
|
|
||
|
--------------------
|
||
|
-- hex lib interface
|
||
|
hex = {
|
||
|
to_dec = to_dec,
|
||
|
to_hex = to_hex,
|
||
|
}
|
||
|
|
||
|
end
|
||
|
|
||
|
--[[
|
||
|
-- test
|
||
|
d = 4341688
|
||
|
h = to_hex(d)
|
||
|
print(h)
|
||
|
print(to_dec(h))
|
||
|
|
||
|
|
||
|
for i = 1, 100000 do
|
||
|
h = hex.to_hex(i)
|
||
|
d = hex.to_dec(h)
|
||
|
if(d ~= i) then
|
||
|
error("failed " .. i .. ", " .. h)
|
||
|
end
|
||
|
end
|
||
|
--]]
|