Lua中如何将数字插入到二进制序列的前32位?
2017-10-14 8:44:17
收藏:0
阅读:108
评论:0
我刚开始使用 OpenResty,对于 Lua 还是新手。我想将图片的 x,y 坐标作为一个二进制序列一起输出给客户端,形式:x_int32_bits y_int32_bits image_raw_data。在客户端,我知道前32位是 x,后32位是 y,其他的是图片的原始数据。我遇到了一些问题:
- 怎么将数字转换为32位的二进制位数?
- 怎样将两个32位合并为一个64位的序列?
- 怎样将64位插入到图片原始数据的前面?并且如何最快地实现?
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
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
