Lua 解析帧长度

我有一个二进制文件,如果在记事本中打开它会显示乱码信息。 我正在开发一个插件,将其与wireshark一起使用。

现在我的问题是我需要帮助,我想要读取文件,并在其中查找'V ' '0 ' '0 ' '1 '(0x56 0x30 0x30 0x31),因为它是帧的开头,表示其内部有一个数据包。我需要对整个文件执行此操作,类似于解析。同时,应该以V 0 0 1开始并且不以此结束。 我目前有一个代码,其中我正在搜索0x7E并对其进行解析。我需要的是帧的长度。例如V 0 0 1被发现,所以从V到下一个V 0 0 1之前的位置的长度。因此,我可以使用该长度将其与捕获的长度相加,以获得wireshark可以使用的位置。

以下是我的不完善的0x7E代码示例:

local line = 文件:读取()
 local len = 0

for c in(line or''):gmatch'。'do
    len = len + 1
    if c:byte()== 0x7E then
        break
    end

end

if not line then
    return false
end

frame.captured_length = len

这里也存在问题,即该帧以7E结尾,这是错误的。我需要完美解决'V' '0' '0' '1'的方法。也许我需要使用string.find? 求助!

这是使用Visual Studio Code中的HEX-Editor查看文件时的示例。 enter image description here

点赞
用户12110258
用户12110258

Lua 有一些不错的模式工具。以下是一个摘要:

  • (...) 导出 () 中的所有捕获文本并给我们。
  • -+*?,分别代表“尽可能少地选择可选匹配”、“尽可能多地选择强制匹配”、“尽可能多地选择可选匹配”、“只匹配一次可选项”。
  • ^$:分别代表文件开始和结束。

我们将使用此通用输入和输出来进行测试:

local output = {}
local input = "V001Packet1V001Packet2oooV001aaandweredonehere"

最简单的方法可能是递归地拆分字符串,其中一个在字符“V”之前结束,另一个从字符“1”之后开始。我们将使用以下模式导出“V001”之前和之后的部分:

local this, next = string.match(input, "(.-)V001(.*)")
print(this,next)    --> "", "Packet1V001Packet2..."

很简单。现在我们需要再次执行此操作,并且我们还需要消除第一个空包,因为它是模式的怪癖。我们可以说只要任何空的 this 字符串都不应被添加:

if this ~= "" then
    table.insert(output, this)
end

现在,由于最后一个 V001 不会在末尾出现,因此最后一个数据包将对 thisnext 均返回 nil。我们可以通过在模式不匹配时添加字符串的最后一部分来做好准备。

所有内容都组合在一起:

local function doStep(str)
    local this, next = string.match(str, "(.-)V001(.*)")
    print(this,next)

    if this then
        --  仍有更多数据包
        if this ~= "" then
            --  这是一个空包
            table.insert(output, this)
        end

        if next ~= "" then
            --  还有更多的数据包!
            doStep(next)
        end
    else
        --  最后一个数据包
        table.insert(output, str)
    end
end

当然,这可以改进,但应该是一个不错的起点。为了证明它有效,此脚本:

doStep(input)
print(table.concat(output, "; "))

会输出:

Packet1; Packet2ooo; aaandweredonehere
2021-03-19 23:04:19