在Lua 4中将十进制转换为十六进制?

8
我在Lua中找到了一种将十进制数转换为十六进制颜色值的公式:

http://lua-users.org/lists/lua-l/2004-09/msg00054.html

然而,我对这个公式有一些问题:

  1. 我的输入需要在0到1之间归一化,而不是在0到255之间。这会造成潜在的问题吗?
  2. 我被困在Lua 4.01中,而不是最新版本。我无法升级。这会有问题吗?

谢谢!


你确定是Lua 4.1而不是5.1吗?Lua 5.1仍然广泛使用(因为它是LuaJIT支持的Lua版本),但Lua 4.1非常古老,你会很难找到好的文档!https://www.lua.org/versions.html - hugomg
你能给出你想要的输入和输出的例子吗?我通常看到十六进制被用于整数,所以在0和1之间使用它们有点不寻常。 - hugomg
输入0.5,输出80。 - posfan12
“我的输入需要被归一化为0到1,而不是0到255。”这是什么意思?您提供的例程并没有对输入进行归一化处理。此外,您提供的例程可以用string.format('%x')替换。 - Mud
3
@posfan12 - output = format("%02x", input*256) @posfan12 - 输出 = 格式化("%02x", 输入*256) - Egor Skriptunoff
显示剩余5条评论
3个回答

16
在 Lua 5.x 中,您可以使用字符串格式化函数和 %x 格式说明符将整数转换为它们的十六进制表示。在您的情况下,它会像这样:

local input = 0.5
local output = string.format("%x", input * 255) -- "7F"

我不太了解Lua 4.0.1,所以我无法告诉你这个函数是否可用(也许使用不同的名称)。话虽如此,如果不可用,那么您可以通过将其转换为使用 sscanf 的C函数来解决问题。


0

在示例函数中展示的 http://lua-users.org/lists/lua-l/2004-09/msg00054.html 没有转换负数。 这里是正负数转换的示例:

function decimalToHex(num)
    if num == 0 then
        return '0'
    end
    local neg = false
    if num < 0 then
        neg = true
        num = num * -1
    end
    local hexstr = "0123456789ABCDEF"
    local result = ""
    while num > 0 do
        local n = math.mod(num, 16)
        result = string.sub(hexstr, n + 1, n + 1) .. result
        num = math.floor(num / 16)
    end
    if neg then
        result = '-' .. result
    end
    return result
end

感谢回答。但 stringmath 是 Lua 5 对象。 - posfan12

0

使用示例,将负十进制转为正十六进制

local input = -0.5
local output = string.format("%x", math.floor(input * 255)):sub(-2) -- 80

如果你需要转换一个非两位十六进制数,请更改 string.sub 的参数。对于 Lua 4.01 版本:
local input = -0.5
local output = strsub(format("%x", floor(input * 255)), -2) -- 80

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接