Lua中如何将数字插入到二进制序列的前32位?

我刚开始使用 OpenResty,对于 Lua 还是新手。我想将图片的 x,y 坐标作为一个二进制序列一起输出给客户端,形式:x_int32_bits y_int32_bits image_raw_data。在客户端,我知道前32位是 x,后32位是 y,其他的是图片的原始数据。我遇到了一些问题:

  1. 怎么将数字转换为32位的二进制位数?
  2. 怎样将两个32位合并为一个64位的序列?
  3. 怎样将64位插入到图片原始数据的前面?并且如何最快地实现?
  4. file:read("\*a")返回的是字符串类型还是像"000001110000001..."这样的字符串?

我的想法如下,但我不知道怎么将32位转换为与 file:read("\*a") 结果相同的字符串格式。

@EgorSkriptunoff 谢谢你,你为我打开了一扇窗。我写了一些新代码,你能过帮我看一下吗?还有一个问题,当字符串中有一个非常大的字符串时,字符串合并方法 .. 是否效率低下并且昂贵?是否有替代方法来合并字节字符串?

在 @EgorSkriptunoff 的指导下的新代码

function _M.number_to_int32_bytes(num)
    return ffi.string(ffi.new("int32_t[1]", num), 4)
end

local x, y = unpack(v)

local file, err = io.open(image_path, "rb")

if nil ~= file then
    local image_raw_data = file:read("*a")
    if nil == image_raw_data then
        ngx.log(ngx.ERR, "read file error:", err)
    else
        --字符串合并方法 `..` 是否效率低下并且昂贵?
        --因为图像原始数据可能会很大,所以 `..` 是否会将所有数据复制到一个新字符串中?
        --是否有替代方法来合并字节字符串?
        output = utils.number_to_int32_bytes(x) .. utils.number_to_int32_bytes(y) .. image_raw_data

        ngx.print(output)
        ngx.flush(true)
    end

    file:close()
end

旧代码:

function table_merge(t1, t2)
   for k,v in ipairs(t2) do
      table.insert(t1, v)
   end

   return t1
end

function numToBits(num, bits)
    -- 返回比特位的表
    local t={} -- 包含比特位
    for b=bits,1,-1 do
        rest=math.fmod(num,2)
        t[b]=rest
        num=(num-rest)/2
    end
    if num==0 then return t else return {'不足以表示这个数字的比特位'} end
end

-- 需要将 x,y 分别插入到图像二进制序列的前32位
function output()
    local x = 1, y = 3
    local file, err = io.open("/storage/images/1.png", "rb")

    if nil ~= file then
        local d = file:read("*a") ------- type(d) 等于 string,为什么?
        if nil == d then
            ngx.log(ngx.ERR, "read file error:", err)
        else
            -- 我的想法 -----------------

            -- 将 x,y 转换为二进制表,然后将它们合并为一个二进制表
            data = table_merge(numToBits(x, 32), numToBits(y, 32))

            -- 将数据从二进制表转换为字符串
            data = convert_binary_table_to_string(data) -- 怎么做? --------

            -- 将 x,y 数据插入到图像数据的前面,`data .. d` 是无效的吗?
            data = data .. d

            --------------------------------

            ngx.print(data)
            ngx.flush(true)
        end

        file:close()
    end
end
点赞