Lua,处理非ASCII字节流,字节顺序更改。
2011-3-9 5:36:12
收藏:0
阅读:211
评论:3
需要对包含非 ASCII 字符的字节流进行编码和解码,从/到 uint16、uint32、uint64(它们在 C/C++ 中的典型含义),并注意大小端。有没有一种高效且跨平台的方式可以在 Lua 中实现?
我的目标架构是 64 位 x86_64,但希望保持可移植性(如果不影响性能)。
例如:
解码(假设当前在 Lua 字符串中)—— 0x00,0x1d,0xff,0x23,0x44,0x32(小端序) 作为 - uint16:(0x1d00)=7424 uint32:(0x324423ff)=843326463
如果有人能举例说明,那就太好了。
原文链接 https://stackoverflow.com/questions/5241799
点赞
stackoverflow用户221509
在这个例子中,我使用 struct.unpack
将 Lua 字符串解码为两个强制使用小端编码的整数:
require 'struct'
-- 将字符编码转换为 Lua 字符串 - 这可能来自于您的源代码
local str = string.char(0x00, 0x1d, 0xff, 0x23, 0x44, 0x32)
-- 格式字符串:< = 小端,In = 无符号整数(n 个字节)
local u16, u32 = struct.unpack('<I2I4', str)
print(u16, u32) --> 7424 843326463
2011-03-09 12:09:41
stackoverflow用户7137018
以下是没有参数检查的“Int16ToByte”函数的建议:
function Int16ToBytes(num, endian)
如果 num < 0 then
num = num & 0xFFFF
end
highByte = (num & 0xFF00) >> 8
lowByte = num & 0xFF
如果 endian == "little" then
lowByte, highByte = highByte, lowByte
end
返回 string.char(highByte,lowByte)
end
2016-11-09 15:16:27
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
将下面翻译成中文并且保留原本的 markdown 格式,用于将字节转换为整数(同时处理字节级别、有符号性):
function bytes_to_int(str,endian,signed) -- 使用字符串长度确定8、16、32、64位 local t={str:byte(1,-1)} if endian=="big" then -- 反转字节 local tt={} for k=1,#t do tt[#t-k+1]=t[k] end t=tt end local n=0 for k=1,#t do n=n+t[k]*2^((k-1)*8) end if signed then n = (n > 2^(#t*8-1) -1) and (n - 2^(#t*8)) or n -- 如果最后一位设置了,说明为负数。 end return n end
顺便再讲一下另一个方向:
function int_to_bytes(num,endian,signed) if num<0 and not signed then num=-num print"warning, dropping sign from number converting to unsigned" end local res={} local n = math.ceil(select(2,math.frexp(num))/8) -- 要使用的字节数。 if signed and num < 0 then num = num + 2^n end for k=n,1,-1 do -- 每个字符有256个=2^8位。 local mul=2^(8*(k-1)) res[k]=math.floor(num/mul) num=num-res[k]*mul end assert(num==0) if endian == "big" then local t={} for k=1,n do t[k]=res[n-k+1] end res=t end return string.char(unpack(res)) end
欢迎提出任何评价,已经测试过了,但并不是很彻底。。。