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 ...
随机推荐
- linux内核源码目录结构分析
原文地址 /arch.arch是architecture的缩写.arch目录下是好多个不同架构的CPU的子目录,譬如arm这种cpu的所有文件都在arch/arm目录下,X86的CPU的所有文件都在a ...
- JavaScript数组入门。
JavaScript中的array对象就是数组,首先是一个动态数组,而且是一个像c#中 数组 arraylist hashtable等的综合体. var arr = [1, 7, 3, 4, 5]; ...
- C#操作DataReader类
一.常用属性 名称 说明 Depth 获取一个值,用于指示当前行的嵌套深度 FieldCount 获取当前行中的列数 HasRows 获取一个值,该值指示 SqlDataReader 是否有行 IsC ...
- 从零开始学安全(二十六)●利用Nmap目标的本版进行探测
通过对对方电脑的服务探测 对本版较低的服务 或者无补丁的服务 可以直入侵 版本探测 version 后边就是版本
- [PHP]算法-二进制中1的个数的PHP实现
二进制中1的个数: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: 1.右移位运算>> 和 与运算& 2.先移位个然后再与1 &运算为1的就是1 ...
- Spring Boot从入门到精通之:二、Spring Boot整合JPA
springboot-jpa 开发工具 系统: windows10 开发工具: Intellij IDEA 2018.2.6 springboot: 2.0.6.RELEASE jdk: 1.8.0_ ...
- Javascript继承5:如虎添翼----寄生式继承
/* * 寄生式继承 * 其实就是对原型继承的第二次封装,在封装过程中对继承的对象进行了扩展. * 也存在原型继承的缺点!! * 这种思想的作用也是为了寄生组合式继承模式的实现. */ //声明基对象 ...
- @RequestParam加与不加的区别
最简单的两种写法,加或不加@RequestParam注解 @RequestMapping("/list") public String test(int userId) { ret ...
- 洛谷P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)
题意 题目链接 Sol 打出暴力不难发现时间复杂度的瓶颈在于求\(\sum_{i = 1}^n i^k\) 老祖宗告诉我们,这东西是个\(k\)次多项式,插一插就行了 上面的是\(O(Tk^2)\)的 ...
- springboot 常用配置文件
1.连接数据库 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId> ...