Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 多个字节后的lua分析_Parsing_Lua_Hex_Byte - Fatal编程技术网

Parsing 多个字节后的lua分析

Parsing 多个字节后的lua分析,parsing,lua,hex,byte,Parsing,Lua,Hex,Byte,如何在超过一个字节后解析二进制文件? 例如: 56 30 30 31 07 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 01 45 7E 12 02 EF BF BD 00 EF BF BD 1F 56 30 31 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 45 24 56 30 31 04 00 EF BF BD 2A 5C EF BF BD 03 02 45 13 00 00 00 56 30 30 30 30

如何在超过一个字节后解析二进制文件? 例如:

56 30 30 31 07 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 01 45 7E 12 02 EF BF BD 00 EF BF BD 1F 56 30 31 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 45 24 56 30 31 04 00 EF BF BD 2A 5C EF BF BD 03 02 45 13 00 00 00 56 30 30 30 30 30 30 30 07 00 00 EF BF BD 03 01 45 7E 12 02 24 00 4D EF BF

我想在0x56 0x30 0x30 0x31之后解析它。我该怎么做?在每个新的0x56 0x30 0x30 0x31之前,旧的packetstring应该结束

像这样:

56 30 30 31 07 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 01 45 7E 12 02 EF BF BD 00 EF BF BD 1F

56 30 30 31 01 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 02 45 24

56 30 30 31 04 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 02 45 13 00 00

56 30 30 31 07 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 01 45 7E 12 02 24 00 4D EF BF

我已经做了一些simular来解析一个字节后的表。但我不能把它变成我的新问题。 这是一个字节0x7E之后的解析代码

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)
重要的是,56 30 31与字符串中的首字母相同。 谢谢你的帮助

我还需要从文件中读取输入。 我正在以下列方式读取我的文件:

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
您可以使用来将目标子字符串替换为输入字符串唯一的单个字符,本例中我将使用\n。之后,您可以使用where,它选择一个不是被替换字符的字符运行

本地输入=[[56 30 30 31 07 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 01 45 7E 12 02 EF BF BD 00 EF BF BD 1F 56 30 31 01 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 45 24 56 30 31 04 00 EF BF BD 2A 5C EF BF BD 03 02 45 13 00 00 00 00 00 56 30 30 30 31 07 00 EF BF BD 2A BF BD 5C BF BD 03 45 45 7 E 12 02 24 00 4D EF BF]] 本地模式=[^\n]+ 本地行前缀=56 30 31 输入=输入:gsubrowPrefix\n 对于输入中的行:gmatchpattern do printrowPrefix..行 终止 输出:

56 30 30 31 07 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 01 45 7E 12 02 EF BF BD 00 EF BF BD 1F 56 30 30 31 01 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 02 45 24 56 30 30 31 04 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 02 45 13 00 00 56 30 30 31 07 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 01 45 7E 12 02 24 00 4D EF BF 有关更多信息,请参阅参考资料:

修改此代码:

S=[[56 30 30 31 07 00 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 01 45 7E 12 02 EF BF BD 00 EF BF BD 1F 56 30 30 31 01 00 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 02 45 24 56 30 30 31 04 00 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 02 45 13 00 00 00 56 30 30 31 07 00 00 00 EF BF BD EF BF BD 2A 5C EF BF BD 03 01 45 7E 12 02 24 00 4D EF BF]]
H=[[56 30 30 31]]
E="\n"
S=S:gsub(H,E..H)
S:gsub(E.."([^"..E.."]+)",print)

与Nifim的答案非常相似。我如何才能在中读取一个文件作为输入?你称之为S@Laura,以字符串形式阅读整个文件。你能告诉我怎么做吗?我没有想到在gsub步骤中只是将E前置到H,这是我需要记住的一点,作为一个选项。我了解你的解决方案,但我有另一个问题。我正在我的inpu中阅读不是从文件中获取的。因此,它对文件不起作用。或者,我如何将文件的数据转换为字符串作为输入?您可以这样做:path=some\\path\\to\\file.txt;local f=assertio.openpath;local data=f:read*all;f:close;实际上,我看到您的OP中有一个函数,用于将整个文件读入一个变量,即本例中的内容我相信我理解,您的数据不是56 30 31,而是\56\30\30\31?是的,它是十六进制的。很抱歉,在建议的行前缀更改中忘记了x,它应该是\x56\x30\x31