使用 LUA 解码 UDP 消息
2018-9-9 10:19:46
收藏:0
阅读:92
评论:2
我相对于 LUA 和编程(自学)是比较新的,所以请温柔一点!
无论如何,我写了一个 LUA 脚本来读取一个游戏中的 UDP 消息。该消息的结构为:
DATAxXXXXaaaaBBBBccccDDDDeeeeFFFFggggHHHH
DATAx = 4 个字母的 ID,x = 控制字符
XXXX = 整数显示数据组(已知组)
aaaa...HHHHH = 8 个单精度浮点数
最后这一部分是我需要解码的数字。
如果我将接收到的消息打印出来,就像这样:
DATA*{V???A?A?...等。
使用_string.byte()_,我得到了像这样的一串字节(我已经“格式化”了这些字节以反映上面的结构)。
68 65 84 65/42/20 0 0 0/237 222 28 66/189 59 182 65/107 42 41 65/33 173 79 63/0 0 128 63/146 41 41 65/0 0 30 66/0 0 184 65
前 5 个字节当然是 DATA *。接下来 4 个字节是第 20 组数据。下一个字节序列是我需要解码的, 并且等于这些值:
237 222 28 66 = 39.218
189 59 182 65 = 22.779
107 42 41 65 = 10.573
33 173 79 63 = 0.8114
0 0 128 63 = 1.0000
146 41 41 65 = 10.573
0 0 30 66 = 39.500
0 0 184 65 = 23.000
我找到了使用 BitConverter.ToSingle() 进行解码的 C# 代码,但我还没有找到这样的 Lua 代码。有什么想法吗?
点赞
用户1847592
你用的是什么版本的 Lua?
这段代码可以在 Lua 5.3 上运行:
local str = "DATA*\20\0\0\0\237\222\28\66\189\59\182\65..."
-- 从字符串的第 10 位开始读取两个浮点值
print(string.unpack("<ff", str, 10)) --> 39.217700958252 22.779169082642 18
-- 18(返回的第三个值)是字符串中的下一个位置
在 Lua 5.1 上,你需要编写一个特殊函数(或从 François Perrad 的 git 仓库中偷取 ):
local function binary_to_float(str, pos)
local b1, b2, b3, b4 = str:byte(pos, pos+3)
local sign = b4 > 0x7F and -1 or 1
local expo = (b4 % 0x80) * 2 + math.floor(b3 / 0x80)
local mant = ((b3 % 0x80) * 0x100 + b2) * 0x100 + b1
local n
if mant + expo == 0 then
n = sign * 0.0
elseif expo == 0xFF then
n = (mant == 0 and sign or 0) / 0
else
n = sign * (1 + mant / 0x800000) * 2.0^(expo - 0x7F)
end
return n
end
local str = "DATA*\20\0\0\0\237\222\28\66\189\59\182\65..."
print(binary_to_float(str, 10)) --> 39.217700958252
print(binary_to_float(str, 14)) --> 22.779169082642
2018-09-09 05:49:54
评论区的留言会收到邮件通知哦~
推荐文章
- 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 代码?

这是 IEEE-754 单精度二进制的小端字节序:
例如,
0 0 128 63可以表示为:00111111 10000000 00000000 00000000 (63) (128) (0) (0)
为什么这等于
1需要了解 IEEE-754 表示的最基本原理,即其指数和尾数的使用。请参见 这里。请参见 @Egor 的上面的答案,以了解如何在 Lua 5.3 中使用
string.unpack()和一个你可以在早期版本中使用的可能实现。