lua 十六进制与十进制相互转换

本文介绍了一个Lua函数,用于将RGB颜色值转换为16进制颜色字符串,并提供了一个逆向转换函数,即将16进制颜色字符串转换回RGB颜色值。通过这个实用工具,开发者可以方便地在不同的颜色表示形式之间进行切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--[[--
    rgb转成16进制
]]
function converRGB2Hex(color)
   local str = ""
   --十进制转到十六进制
   if string.len(string.sub(string.format("%#x",color.r),3)) == 1 then 
        str = str.."0" .. string.sub(string.format("%#x",color.r),3)
   else
        str = str.. string.sub(string.format("%#x",color.r),3)
   end
   if string.len(string.sub(string.format("%#x",color.g),3)) == 1 then 
        str = str.."0" .. string.sub(string.format("%#x",color.g),3)
   else
        str = str.. string.sub(string.format("%#x",color.g),3)
   end
   if string.len(string.sub(string.format("%#x",color.b),3)) == 1 then 
        str = str.."0" .. string.sub(string.format("%#x",color.b),3)
   else
        str = str.. string.sub(string.format("%#x",color.b),3)
   end
   return str
end


function tocolor(num)
local hex = string.format("%02X", num)
    local b = string.sub(hex, -2, -1)
    local g = string.sub(hex, -4, -3)
    local r = string.sub(hex, -6, -5)
    return cc.c3b(tonumber("0x" .. r),tonumber("0x" .. g), tonumber("0x" .. b))
end
<think>在 Lua 中将十进制整数转换十六进制字符串有多种方法,下面介绍几种常用方法: ### 方法一:使用 `string.format` 函数(最简单) ```lua local num = 255 local hexStr = string.format("%x", num) -- 小写十六进制 print(hexStr) -- 输出 "ff" local hexStrUpper = string.format("%X", num) -- 大写十六进制 print(hexStrUpper) -- 输出 "FF" ``` ### 方法二:自定义转换函数(支持大数) 当数字超过32位整数范围时,`string.format`可能不准确。可以使用以下函数处理大整数: ```lua function decimalToHex(n) if type(n) ~= "number" then return nil, "not a number" end local hex = "" local remainder while n > 0 do remainder = n % 16 if remainder < 10 then hex = string.char(48 + remainder) .. hex -- '0'~'9' else hex = string.char(55 + remainder) .. hex -- 'A'~'F' end n = math.floor(n / 16) end return hex ~= "" and hex or "0" end -- 测试 print(decimalToHex(255)) -- 输出 "FF" print(decimalToHex(0)) -- 输出 "0" print(decimalToHex(65535)) -- 输出 "FFFF" ``` ### 方法三:使用位运算(Lua 5.3+) Lua 5.3+ 支持位运算,可以高效转换: ```lua function decimalToHex(n) if n == 0 then return "0" end local hexChars = "0123456789ABCDEF" local hex = "" while n > 0 do local index = (n & 0xF) + 1 hex = hexChars:sub(index, index) .. hex n = n >> 4 end return hex end -- 测试 print(decimalToHex(255)) -- 输出 "FF" ``` ### 方法四:处理负数 如果需要支持负数,可以添加符号处理: ```lua function decimalToHex(n) if n == 0 then return "0" end local isNegative = n < 0 n = math.abs(n) local hex = "" while n > 0 do hex = string.format("%X", n % 16) .. hex n = math.floor(n / 16) end return isNegative and ("-" .. hex) or hex end -- 测试 print(decimalToHex(-255)) -- 输出 "-FF" ``` ### 注意事项 1. **大小写控制**: - `string.format` 中 `%x` 为小写,`%X` 为大写 - 自定义函数中可调整 `string.char` 参数控制大小写 2. **零值处理**:需单独处理输入为0的情况 3. **浮点数转换**:以上方法仅适用于整数,浮点数需按IEEE 754标准转换(参考之前的浮点数转换方法) 4. **大数限制**:Lua的`number`类型可能是双精度浮点数,精确整数范围仅为 $[-2^{53}, 2^{53}]$,超出此范围需使用字符串处理 ### 完整示例(含测试) ```lua -- 综合方案:支持正负整数、0、大小写可选 function decimalToHex(n, uppercase) if n == 0 then return "0" end uppercase = uppercase or false -- 默认大写 local hexChars = uppercase and "0123456789ABCDEF" or "0123456789abcdef" local isNegative = n < 0 n = math.abs(n) local hex = "" while n > 0 do local remainder = n % 16 hex = hexChars:sub(remainder+1, remainder+1) .. hex n = math.floor(n / 16) end return isNegative and ("-" .. hex) or hex end -- 测试用例 print(decimalToHex(0)) -- 0 print(decimalToHex(10)) -- A print(decimalToHex(255)) -- FF print(decimalToHex(-255, true)) -- -FF print(decimalToHex(65535, false)) -- ffff ``` ### 性能建议 - 小整数:优先使用 `string.format("%X", num)` - 大整数:使用自定义循环函数 - LuaJIT环境:`bit` 库可优化位运算 §§相关问题§§ 1. Lua 中如何将十六进制字符串转换十进制整数? 2. 如何将浮点数转换十六进制字符串(IEEE 754 格式)? 3. Lua 5.2 及以下版本如何进行进制转换? 4. 如何实现二进制、八进制十进制相互转换?</think>在 Lua 中将十进制整数转换十六进制字符串有多种方法,以下是几种常用且可靠的方式: ### 方法一:使用 `string.format`(推荐) ```lua -- 基本转换 local num = 255 local hexStr = string.format("%x", num) -- 小写十六进制 print(hexStr) -- 输出 "ff" -- 大写十六进制 local hexUpper = string.format("%X", num) print(hexUpper) -- 输出 "FF" -- 带前缀的十六进制 local hexWithPrefix = string.format("0x%X", num) print(hexWithPrefix) -- 输出 "0xFF" -- 固定长度(4位)带前导零 local fixedHex = string.format("%04X", 15) print(fixedHex) -- 输出 "000F" ``` ### 方法二:自定义转换函数(支持大数) 当数字超过 32 位时,`string.format` 可能不准确。此方法支持任意大整数: ```lua function decimalToHex(n) if type(n) ~= "number" or n % 1 ~= 0 then error("Input must be an integer") end local hexChars = "0123456789ABCDEF" local result = "" local isNegative = n < 0 n = math.abs(n) repeat local remainder = n % 16 result = hexChars:sub(remainder+1, remainder+1) .. result n = math.floor(n / 16) until n == 0 return isNegative and "-" .. result or result end -- 测试 print(decimalToHex(255)) -- 输出 "FF" print(decimalToHex(-100)) -- 输出 "-64" print(decimalToHex(0)) -- 输出 "0" print(decimalToHex(4294967295)) -- 输出 "FFFFFFFF"(大数支持) ``` ### 方法三:使用 `bit` 库(LuaJIT 或安装 bitop) ```lua -- 需要安装 bitop 库或使用 LuaJIT local bit = require("bit") function toHex(n) return string.format("%X", bit.tobit(n)) end print(toHex(255)) -- 输出 "FF" ``` ### 方法四:使用 `string.pack`(Lua 5.3+) ```lua -- 将数字打包为二进制再十六进制 function numToHex(n) local s = string.pack(">I4", n) -- 大端序32位整数 return (s:gsub(".", function(c) return string.format("%02X", string.byte(c)) end)) end print(numToHex(255)) -- 输出 "000000FF" ``` ### 关键说明 1. **大小写控制**: - `%x` → 小写十六进制(a-f) - `%X` → 大写十六进制(A-F) 2. **格式化选项**: ```lua string.format("%08X", num) -- 8位固定长度,前导零填充 string.format("0x%X", num) -- 添加0x前缀 ``` 3. **特殊值处理**: ```lua print(string.format("%X", 0)) -- 输出 "0" print(string.format("%02X", 0)) -- 输出 "00"(前导零) ``` 4. **负数处理**: ```lua print(string.format("%X", -1)) -- 输出 "FFFFFFFF"(32位补码) ``` ### 完整示例 ```lua -- 综合转换函数(支持大小写和前缀) function dec2hex(n, options) options = options or {} local uppercase = options.upper or true local prefix = options.prefix or false local width = options.width or 0 local fmt = "%0" .. (width > 0 and width or "") .. (uppercase and "X" or "x") local result = string.format(fmt, n) if prefix then return (uppercase and "0X" or "0x") .. result end return result end -- 测试 print(dec2hex(255)) -- 输出 "FF" print(dec2hex(15, {width=4})) -- 输出 "000F" print(dec2hex(255, {prefix=true})) -- 输出 "0XFF" print(dec2hex(255, {upper=false})) -- 输出 "ff" ``` ### 注意事项 1. **整数范围**: - Lua 的 `number` 类型是双精度浮点数,精确整数范围为 $[-2^{53}, 2^{53}]$ - 超出范围时使用自定义转换函数更可靠 2. **浮点数转换**: ```lua -- 浮点数需先为整数 local floatNum = 3.14 print(string.format("%X", math.tointeger(floatNum))) -- 输出 "3" ``` 3. **字节序问题**: - 多字节整数需明确字节序(参考 `string.pack` 的 `<` 小端序 `>` 大端序)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值