我正在尝试从二进制文件中读取十六进制值。我没有提取字符串并将字母转换为十六进制值的问题,但是如何使用控制字符和其他不可打印的字符呢?有没有一种方法可以直接以十六进制值读取字符串而无需转换它?
答案 0 :(得分:3)
查看here:
作为最后一个示例,以下程序转储二进制文件。同样,第一个程序参数是输入文件名;输出转到标准输出。程序以10个字节的块为单位读取文件。对于每个块,它写入每个字节的十六进制表示,然后将块写为文本,将控制字符更改为点。
local f = assert(io.open(arg[1], "rb"))
local block = 10
while true do
local bytes = f:read(block)
if not bytes then break end
for b in string.gfind(bytes, ".") do
io.write(string.format("%02X ", string.byte(b)))
end
io.write(string.rep(" ", block - string.len(bytes) + 1))
io.write(string.gsub(bytes, "%c", "."), "\n")
end
答案 1 :(得分:3)
从你的问题来看,目前还不清楚你的目标是什么,所以我会给出两种方法。
要么文件已满十六进制值,请按以下方式读取:
s='ABCDEF1234567890'
t={}
for val in s:lower():gmatch'(%x%x)' do
-- do whatever you want with the data
t[#t+1]=s:char(val)
end
或者您有一个二进制文件,并将其转换为十六进制值:
s='kl978331asdfjhvkasdf'
t={s:byte(1,-1)}