项目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)   -- 1fffffffflocal 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 & 0xFFFFFFFFif b <= 0 or (a & 0x80000000) == 0 thenreturn (a >> b) & 0xFFFFFFFFelsereturn((a >> b) | ~(0xFFFFFFFF >> b)) & 0xFFFFFFFFend
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)

转载于:https://www.cnblogs.com/zsb517/p/6845544.html

Lua-pb 升级到Lua5.3相关推荐

  1. 安装Windows Lua5.1 x86|x64 开发环境(Windows Lua LuaRocks msvc)

    安装Windows Lua5.1 x86|x64 开发环境 1. 背景 1.1 二进制版本问题 1.2 luajit的兼容性 2.兼容安装Lua5.1 x86 环境 3.编译安装Lua5.1 x64环 ...

  2. Lua快速入门篇(基础概述)(Yanlz+toLua+xLua)

    <Lua热更新> ##<Lua热更新>发布说明: ++++"Lua热更新"开始了,立钻哥哥终于开始此部分的探索了. ++++作为游戏发布迭代的重要技术:Lu ...

  3. 留念,第一次在C中调用lua成功!

    反反复复学lua N多次了,这次终于在C中调用lua成功了!一大进步啊! 记录下过程: 1.找到代码如下: //add.c #include        <stdio.h> #inclu ...

  4. 介绍LuaPlus: 好用的Lua For C++扩展(修订)

    介绍LuaPlus: 好用的Lua For C++扩展(修订) LuaPlus是Lua的C++增强,也就是说,LuaPlus本身就是在Lua的源码上进行增强得来的.用它与C++进行合作,是比较好的一个 ...

  5. 如何配置一套优雅的Lua开发环境

    讨论话题 何为优雅的开发环境 如何部署(本文讨论在MacOSX平台,其他平台也一样适用) 优雅的Lua开发环境 优雅的Lua开发环境至少包含以下几点: 安装适合需求的最新稳定版Lua 安装合适的Lua ...

  6. lua 调用c++ dll, 提示:%1 不是有效的 Win32 应用程序。

    lua 调用c++ dll, 提示:lua: error loading module 'cppdll2' from file '.\cppdll2.dll': %1 不是有效的 Win32 应用程序 ...

  7. Wireshark lua插件

    源地址:https://www.zybuluo.com/natsumi/note/77991 参考:  http://yoursunny.com/t/2008/Wireshark-Lua-dissec ...

  8. PowerBuilder8.0和SQL Server2008稳定升级到PowerBuilder11.5和SQL Server2016源码无报错

    客户是一家跨国企业,当前使用版本为PowerBuilder8.0,数据库使用的SQL Server2008.本次升级是要把老旧的PB升级到新的PowerBuilder11.5版本,数据库升级到SQL ...

  9. lua 连接mysql_luasql连接mysql数据库

    Lua连接数据库不只是luasql这一个库,但是luasql是开源的,支持的数据库有: Connection to ODBC,ADO,Oracle,MySQL,SQLite and PostgreSQ ...

最新文章

  1. C#精髓【月儿原创】第一讲 使用垃圾回收器
  2. 《系统集成项目管理工程师》必背100个知识点-23整体变更控制流程
  3. jquery之ajax请求工具类
  4. 执行单元测试 报TEST class 有不能识别字符
  5. [渝粤教育] 西南科技大学 中学英语教材教法 在线考试复习资料
  6. php 上传多文件_php 多文件上传的实现实例
  7. 【POJ - 1269 】Intersecting Lines (计算几何,直线间的位置关系)
  8. tinyxml c语言,开源TinyXML 最简单的新手教程
  9. python是开源工具吗_微软最强 Python 自动化工具开源了!不用写一行代码
  10. 豆瓣7.6,这部被低估的科幻片告诉你,通过图灵测试的AI有多可怕!
  11. 解决JQuery EasyUI onLoadSuccess执行两次的问题
  12. 使用skin++进行MFC界面美化范例
  13. mysql 5.6 修改默认字符集_mysql5.6修改默认字符集
  14. jquery字符串转json
  15. python 并行_python多进程并行代码实例
  16. MYS-6ULX-IOT 开发板测评——Yocto 创建嵌入式 Linux 发行版
  17. 混合现实开发教程unity2017
  18. js中如何判断一个数是不是素数(三种方法)
  19. sleep的睡眠机制
  20. Qt程序无法启动,debug时提示During startup program exited with code 0xc0000135

热门文章

  1. mysql主从的原理_Mysql主从的原理
  2. sqlserver text最大长度_1156. 单字符重复子串的最大长度
  3. java取multipart_spring的multipartResolver和java后端获取的MultipartHttpServletRequest方法对比...
  4. ?php echo $this_php如何使用echo输出常量+变量?
  5. coreldraw x5 选择工具快捷键_CorelDRAW设置和优化提高工作效率
  6. 20210422:力扣第237周周赛题解记录(上)
  7. 20200805:Java拓扑排序实现力扣207课程表
  8. 20200701:力扣194周周赛上
  9. 绿米开关如何重置_开个灯还带音效?跟我学简单改装智能开关,保证按上瘾!...
  10. hive和hadoop关系