You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

32位Lua编译器下64位大端十六进制数转小端及位运算实现问询

解决方案:32位Lua下处理64位大端转小端及位运算

在32位Lua环境里处理64位数据确实有点棘手——毕竟原生的双精度浮点数只能精确表示到2^53,超过这个范围就会丢失精度。不过我们可以通过拆分64位数据为高低两个32位部分的方式来绕开这个限制,再结合bitop库完成位运算操作,亲测可行,下面是具体步骤:

1. 大端64位十六进制转小端十六进制

首先要把大端字节序的十六进制字符串转换成小端,本质就是反转字节的顺序(每两个十六进制字符对应一个字节):

function hex_big_to_little(big_hex)
    -- 先验证输入是标准64位十六进制字符串
    assert(#big_hex == 16, "必须输入16字符的64位十六进制字符串")
    local little_hex = ""
    -- 从后往前,每两个字符为一组拼接
    for i = #big_hex, 2, -2 do
        little_hex = little_hex .. string.sub(big_hex, i-1, i)
    end
    return little_hex
end

举个例子:输入"123456789ABCDEF0",会输出小端格式的"F0DEBC9A78563412"。

2. 把小端十六进制拆成高低32位数值

转换后的小端十六进制可以拆成高32位和低32位的无符号整数,这样就能在32位Lua里安全处理了:

local bit = require("bit")

function little_hex_to_high_low(little_hex)
    -- 拆分低32位和高32位的十六进制片段
    local low_hex = string.sub(little_hex, 1, 8)
    local high_hex = string.sub(little_hex, 9, 16)
    -- 转成32位无符号整数,用bitop确保无符号特性
    local low = tonumber(low_hex, 16) or 0
    local high = tonumber(high_hex, 16) or 0
    low = bit.band(low, 0xFFFFFFFF)
    high = bit.band(high, 0xFFFFFFFF)
    return high, low
end

示例:输入"F0DEBC9A78563412",会返回high=0x78563412、low=0xF0DEBC9A。

3. 封装64位位运算操作

基于高低32位的结构,我们可以把常用的位运算封装成函数,以下是几个核心操作的实现:

无符号左移

function bit64_lshift(high, low, shift)
    shift = shift % 64 -- 确保移位范围在0-63之间
    if shift == 0 then return high, low end
    if shift < 32 then
        local new_low = bit.bor(bit.lshift(low, shift), bit.rshift(high, 32 - shift))
        local new_high = bit.lshift(high, shift)
        return bit.band(new_high, 0xFFFFFFFF), bit.band(new_low, 0xFFFFFFFF)
    else
        local new_low = bit.lshift(high, shift - 32)
        return 0, bit.band(new_low, 0xFFFFFFFF)
    end
end

无符号右移

function bit64_rshift(high, low, shift)
    shift = shift % 64
    if shift == 0 then return high, low end
    if shift < 32 then
        local new_high = bit.bor(bit.rshift(high, shift), bit.lshift(low, 32 - shift))
        local new_low = bit.rshift(low, shift)
        return bit.band(new_high, 0xFFFFFFFF), bit.band(new_low, 0xFFFFFFFF)
    else
        local new_low = bit.rshift(high, shift - 32)
        return 0, bit.band(new_low, 0xFFFFFFFF)
    end
end

按位与/或

-- 按位与
function bit64_and(h1, l1, h2, l2)
    return bit.band(h1, h2), bit.band(l1, l2)
end

-- 按位或
function bit64_or(h1, l1, h2, l2)
    return bit.bor(h1, h2), bit.bor(l1, l2)
end

完整使用示例

-- 输入大端64位十六进制
local big_hex = "123456789ABCDEF0"
-- 转小端格式
local little_hex = hex_big_to_little(big_hex)
-- 拆分为高低32位
local high, low = little_hex_to_high_low(little_hex)
-- 执行左移8位操作
local new_high, new_low = bit64_lshift(high, low, 8)
-- 输出结果(转成十六进制)
print(string.format("0x%08X%08X", new_high, new_low)) -- 输出: 0x56341200DEBC9AF0

内容的提问来源于stack exchange,提问作者cool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:35:27