【发布时间】:2012-01-23 07:38:48
【问题描述】:
我正在尝试从二进制文件中读取十六进制值。我在提取字符串并将字母转换为十六进制值时没有问题,但是如何使用控制字符和其他不可打印的字符来做到这一点?有没有办法直接以十六进制值读取字符串而无需转换?
【问题讨论】:
我正在尝试从二进制文件中读取十六进制值。我在提取字符串并将字母转换为十六进制值时没有问题,但是如何使用控制字符和其他不可打印的字符来做到这一点?有没有办法直接以十六进制值读取字符串而无需转换?
【问题讨论】:
查看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
【讨论】:
根据您的问题,不清楚您的具体目标是什么,因此我将提供 2 种方法。
要么你有一个包含十六进制值的文件,然后像这样读取它:
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)}
【讨论】: