Lua-pb 升级到Lua5.3
项目lua库升级到5.3版本后,最头疼的就是原先的一些第三方库原先只是基于lua5.1设计的,比如protobuff 相关的的. 之前项目引入Lua-pb 实现protobuf的解析和使用,但是这个库对64位的数据大多是基于32位,有些地方需要修改下。
替换 Struct pack/unpack
Struct似乎不支持64位数据的,比如下面的测试,struct.unpack解压后不会大于0xffffffff,也有可能是C库编译的时候有特别的设置。 反正最后替换为 Lua5.3 自带的string.pack/string.unpack来实现数据pack/unpack
local num = 0x100010ffffffff
printf("src num %d", num) -- 1ffffffff
local packData =struct.pack('<I8', num)
local num2 = struct.unpack('<I8',packData) -- ffffffff
printf("src num %d", num2)
local stringPack = string.pack("<i8",num)
local num3 = string.unpack('<i8',stringPack)
printf("src num %d", num3) -- 1ffffffff
替换 Bit库
Lua-pb 中bit库是使用Luajit中的bit库,引入Lua5.3后就不需要,使用lua5.3实现类似的操作即可,而且支持64位位操作。
What’s new in Lua 5.3 (alpha work 2) 给出了一些方案,可以作为参考。
替换bit库的实现方案:
local bit53 = {}
bit53.band = function(a, b)
return a & b
end
bit53.bor = function(a, b)
return a | b
end
bit53.bxor = function(a, b)
return a ~ b
end
bit53.bnot = function(a)
return ~ a
end
bit53.lshift = function(a, b)
return a << b
end
bit53.rshift = function(a, b)
return a >> b
end
bit53.arshift = function(a, b)
a = a & 0xFFFFFFFF
if b <= 0 or (a & 0x80000000) == 0 then
return (a >> b) & 0xFFFFFFFF
else
return((a >> b) | ~(0xFFFFFFFF >> b)) & 0xFFFFFFFF
end
end
大数编码
之前基于32位的版本,实现比较大的数字(64位)输是通过转换为字符的方式进行的,Lua5.3下 就可以不使用这种方式,例如下面的测试,message,parse后并不能还原,超过32位的部分和输入不对应。
//pb 文件
package big_numbers;
message BigNumbers1 {
required uint64 field1 = 1;
}
//测试文件
local pb = require"pb"
-- load .proto file.
local big_nums = require"protos.big_numbers"
local Max64 = 0x1fffffffffffff
local Max32 = 0xffffffff
local BigNumbers1 = big_nums.BigNumbers1
local msg = BigNumbers1()
msg.field1 = Max64
pb.print(msg)
local bin = msg:Serialize()
print("--- decode message")
local msg1, off = assert(BigNumbers1():Parse(bin))
print(tonumber(msg1.field1))
问题:
local H3 = 0x1ffffffffffffff / 0x100000000 计算得到的结果0x2000000 而不是 0x1ffffff ,似乎是计算溢出的问题,可以这样修改:
local l = num % 0x100000000
local h = (num - l) / 0x100000000
参考:
Bitwise operation
What’s new in Lua 5.3 (alpha work 2)
Google Protocol Buffers Encoding
Google Protocol Buffers 编码(Encoding)
Lua-pb 升级到Lua5.3的更多相关文章
- Lua环境搭建编译[Lua5.2+VS2010]
这里是我编译的和一个测试Demo:http://download.csdn.net/detail/allh45601/6783653 大家如果看我下边说的不是很清楚,可以下载这个具体工程: 群:103 ...
- 关于lua垃圾回收是否会执行__gc函数呢?
直接上代码 -- test.lua do local x = setmetatable({},{ __gc = function() print("works") end }) e ...
- lua pbc
先要将proto文件编译成.pb文件,然后再动态绑定实现lua protobuffer,这就需要了解云风做的pbc的项目,地址为:https://github.com/cloudwu/pbc/blob ...
- debian7编译安装tengine添加lua和ldap模块
1.安装开发环境 # aptitute update # aptitude install -y build-essential # aptitude install -y libldap2-dev ...
- 安装lua和openresty
#### ubuntu 16.04 64bit 安装Lua luajit 及openresty 1 安装lua ,因为luajit 支持lua5.1较好.貌似不支持5.2和5.3作为学习,我就安装5. ...
- 用vs2013编译lua源码方法(一)
用vs2013编译lua源码方法 来源:网络 编辑:admin 1.下载lua源码:lua-5.2.3.tar.gz,解压 2.用vs2013建立一个win32工程: 1)下载后解压到一个目录下 ...
- Mac OS X 上Lua的安装方法
先在Mac OS的终端查询下本机是否已安装Lua Last login: Thu Jul 10 07:54:48 on ttys000 keshans-Mac-mini:~ keshan$ lua - ...
- lua 高级
io操作: io.input(filename):指定一个输入流,可以是标准输入stdin,也可以是一个文件路径,返回一个文件句柄: io.output(filename):指定一个输出流,可以是标准 ...
- Linux 下 Lua 与 LuaSQL 模块安装
相关说明: Lua最近在Nginx的web服务器上挺火的, 它的高效让更多开发喜欢上它, 本文讲述Lua与LuaSQL的安装. 在上几篇mysql-proxy的安装中有提到和操作过. 操作系统: Li ...
随机推荐
- Go Web:Handler
Multiplexer根据URL将请求路由给指定的Handler.Handler用于处理请求并给予响应.更严格地说,用来读取请求体.并将请求对应的响应字段(respones header)写入Resp ...
- [Redux] redux的概述
redux 的概述 随着 javascript 单页应用的不断发展,javascript 需要管理比以往都要多的状态,管理不断变化的 state 非常困难,数据流动不断变的模糊不可预测,代码的开发与维 ...
- [转]Laravel 数据库实例教程 —— 使用查询构建器实现对数据库的高级查询
本文转自:https://laravelacademy.org/post/920.html 上一节我们简单介绍了如何使用查询构建器对数据库进行基本的增删改查操作,这一节我们来探讨如何使用查询构建器实现 ...
- .Net C#域账号登陆验证
//获取登陆页输入的域账号.密码 string domainIP = ""; //域IP string userAccount = ""; //域账号 stri ...
- c# 画布验证码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- frp 初探
条件: (1) 服务器端要有公网 IP (2) 客户端能上网,能够访问服务器的公网 IP 下载 https://github.com/fatedier/frp/releases 根据服务器和客户端的操 ...
- 【Spring】DispatcherServlet的启动和初始化
使用过SpringMVC的都知道DispatcherServlet,下面介绍下该Servlet的启动与初始化.作为Servlet,DispatcherServlet的启动与Serlvet的启动过程是相 ...
- overall error
Overall error is same with total error in math.
- Linq 操作DataTable
class ClientStruct { public string ID = "ID"; public string Name = "Name"; publi ...
- c3p0链接池配置使用
c3p0链接池初步使用:直接上代码 c3p0是开源面粉的连接池,目前使用它的开源项目主要有:Spring,Hibernate等,使用时需要导入相关jar包及配置文件c3p0-config.xml文件 ...