我有几个十六进制值,我尝试写入文件。似乎Lua不支持开箱即用,因为它们都被视为字符串而不是值。我想我必须将更长的十六进制值分解,例如将AABBCC分解为AA,BB,CC并连续对所有十进制值使用string.char()以完成工作。
是否有内置函数允许我直接编写这些值而不先进行转换?我使用了诸如“0xAA”和“\ xAA”之类的转义字符,但这些字符没有用完。
编辑:让我举个例子。我在十六进制编辑器中查看测试文件:
00000000 00 00 00 00 00 00 ......
我想用以下方式用字母“AABBCC”写信给它:
00000000 AA BB CC 00 00 00 ......
我使用转义字符获得的是:
00000000 41 41 42 42 43 43 AABBCC
答案 0 :(得分:25)
我使用以下函数在十六进制字符串和“原始二进制文件”之间进行转换:
function string.fromhex(str)
return (str:gsub('..', function (cc)
return string.char(tonumber(cc, 16))
end))
end
function string.tohex(str)
return (str:gsub('.', function (c)
return string.format('%02X', string.byte(c))
end))
end
可以按如下方式使用:
("Hello world!"):tohex() --> 48656C6C6F20776F726C6421
("48656C6C6F20776F726C6421"):fromhex() --> Hello world!
答案 1 :(得分:2)
所以你有一个像这样的字符串:
value = 'AABBCC'
你想打印它(或把它变成字符串)吗?
'101010101011101111001100'
这个怎么样?
function hex2bin(str)
local map = {
['0'] = '0000'
['1'] = '0001'
['2'] = '0010'
-- etc. up to 'F'
}
return str:gsub('[0-9A-F]', map)
end
请注意,它不会触及任何无法解释为十六进制的字符。
答案 2 :(得分:1)
有这样的功能,因为它很容易写一个。
function writeHex(str,fh)
for byte in str:gmatch'%x%x' do
fh:write(string.char(tonumber(byte,16)))
end
end
这只是明确地将值写入fh文件句柄指向的文件。