Lua:将十六进制值写为二进制文件

时间:2012-02-04 00:47:02

标签: lua hex

我有几个十六进制值,我尝试写入文件。似乎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

3 个答案:

答案 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文件句柄指向的文件。