【问题标题】:parse binary of an file in lua在lua中解析文件的二进制文件
【发布时间】:2021-05-19 08:24:23
【问题描述】:

我需要你的帮助。 我有一个包含二进制文件的文件。我知道一个数据包以 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)

感谢您的帮助!

【问题讨论】:

    标签: file parsing lua binary


    【解决方案1】:

    一种解决方案是使用string.gmatch 从文件内容中提取以"\x7e" 开头的子字符串

    local packets = {}
    for packetstr in data:gmatch("\x7e[^\x7e]+") do
      table.insert(packets, {packetstr:byte(1, #packetstr)})
    end
    

    这样您就可以使用 Lua 的模式匹配功能,因此您不必编写自己的数据包逻辑。

    【讨论】:

    • 感谢您的帮助!你能告诉我怎么打印出来吗?看看结果。
    • @Laura 数据包是一个包含数字的表。只使用一个循环?什么不清楚?
    • 是的,抱歉。如果我使用本地字节 = {data:byte(1,#data)} 会出现错误:堆栈溢出(字符串切片太长)我该怎么办?
    • 其他解决方案呢?我没有用大文件测试过它。你的文件有多大?
    • 第二个 sn-p 假定您已将文件内容读入本地数据。在你的情况下就是 fileContent
    【解决方案2】:

    我为我的问题找到了另一个答案。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 2015-06-21
      • 1970-01-01
      • 2018-03-07
      • 2020-05-21
      • 2023-03-11
      • 1970-01-01
      • 2010-10-19
      相关资源
      最近更新 更多