在Lua中解析文件的二进制
2021-10-14 11:58:27
收藏:0
阅读:235
评论:2
我需要你的帮助。 我有一个带有二进制数据的文件。我知道一个数据包以0x7E开始。我想将整个文件都放到一个大表格中,然后将表格分成以0x7E开头的小表格。 我已经开始将二进制数据转换为十六进制并使用它来处理,但我认为使用二进制会更容易些,但我不知道如何做到这一点。 例如,二进制文件中的一行如下所示:
我已经能够读取文件,将其转换为十六进制并统计文件中的0x7E数量和文件的长度。但是数量和长度并不是必要的信息。我认为使用字符串是错误的,因为它们的字节长度不同。你能帮助我解析文件吗?我也考虑过使用回调函数,但我不知道如何做到这一点。我是新手。 我现在的代码如下所示:
local function read_file(path) --function read_file
local file = io.open(path, "rb") -- r read mode and b binary mode
if not file then return nil end
local content = file:read "*all" -- *all reads the whole file
file:close()
return content
end
function string.tohex(str)
return (str:gsub('.',function(c)
return string.format('%02X',string.byte(c))
end))
end
local fileContent = read_file("H:/wireshark/rstp_dtc_0.dat"); --passes file content to function read_file
inhalt = (fileContent):tohex()
s=inhalt
t={}
for k in s:gmatch"(%x%x)" do
table.insert(t,tonumber(k,16))
end
function tablelength(T)
local count = 0
for _ in pairs (T) do count = count +1 end
return count
end
length = tablelength(t)
print(length)
counter = 0
local items = t
for _, v in pairs(items) do
if v == 0x7E then
counter = counter+1
end
end
print(counter)
谢谢你的帮助!
点赞
用户15175264
我找到了另一个关于我问题的答案。
function print_table(tab)
print("Table:")
for key, value in pairs(tab) do
io.write(string.format("%02X ", value))
end
print("\n")
end
local function read_file(path, callback)
local file = io.open(path, "rb")
if not file then
return nil
end
local t = {}
repeat
local str = file:read(4 * 1024)
for c in (str or ''):gmatch('.') do
if c:byte() == 0x7E then
callback(t) -- function print_table
t = {}
else
table.insert(t, c:byte())
end
end
until not str
file:close()
return t
end
local result = {}
function add_to_table_of_tables(t)
table.insert(result, t)
end
local fileContent = read_file("file.dat", print_table)
2021-02-23 08:59:13
评论区的留言会收到邮件通知哦~
推荐文章
- 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 代码?

一个解决方法是使用
string.gmatch从文件内容中提取以"\x7e"开头的子字符串。local packets = {} for packetstr in data:gmatch("\x7e[^\x7e]+") do table.insert(packets, {packetstr:byte(1, #packetstr)}) end这样你就可以使用 Lua 的模式匹配功能来避免编写自己的包逻辑。