Lua 5.4如何将超64位(最高256位)十进制数转为十六进制?
Lua中256位以内十进制大数字转十六进制的解决方法
Lua的原生整数类型(Lua 5.4+)为64位有符号整数,最大值为9223372036854775807。当数值超过这个范围时,无法用number类型精确存储(会转为浮点数并丢失精度),直接调用string.format("%x")会因参数不是有效整数而报错。
解决思路:
由于大数字无法用原生数值类型处理,需以字符串形式存储十进制数,手动实现十进制字符串到十六进制字符串的转换算法。核心逻辑是通过字符串模拟除法,反复将十进制数除以16,记录余数,最终将余数逆序拼接得到十六进制结果。
具体实现代码
首先实现字符串除以16的辅助函数,用于获取商和余数:
function divide_by_16(decimal_str) local quotient = "" local remainder = 0 local has_non_zero = false for i = 1, #decimal_str do local digit = tonumber(decimal_str:sub(i, i)) local current = remainder * 10 + digit local q = math.floor(current / 16) remainder = current % 16 if q ~= 0 or has_non_zero then quotient = quotient .. tostring(q) has_non_zero = true end end return quotient == "" and "0" or quotient, remainder end
然后实现主转换函数:
function decimal_to_hex(decimal_str) -- 去除前导零 decimal_str = decimal_str:gsub("^0+", "") decimal_str = decimal_str == "" and "0" or decimal_str local hex_digits = {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"} local result = {} while decimal_str ~= "0" do decimal_str, rem = divide_by_16(decimal_str) table.insert(result, hex_digits[rem + 1]) end return #result == 0 and "0" or table.concat(result):reverse() end
测试示例
-- 测试64位最大值 print(decimal_to_hex("9223372036854775807")) -- 输出:7fffffffffffffff -- 测试超过64位的数值 print(decimal_to_hex("9223372036854775808")) -- 输出:8000000000000000 -- 测试256位最大值(2^256 - 1) print(decimal_to_hex("115792089237316195423570985008687907853269984665640564039457584007913129639935")) -- 输出:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
注意事项
- 输入必须是十进制数字字符串,不能直接传入超出范围的
number类型(否则会提前丢失精度)。 - 函数支持处理0到2^256-1之间的所有十进制数,满足最高256位的需求。
内容的提问来源于stack exchange,提问作者Weber Felipe
相关产品推荐
相关产品推荐

