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

我有几个十六进制值想要写入文件。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

原文链接 https://stackoverflow.com/questions/9137415

点赞
stackoverflow用户4323
stackoverflow用户4323

所以你有一个字符串:

value = 'AABBCC'

你想打印它(或把它变成一个字符串)像这样吗?

'101010101011101111001100'

那么这样怎么样?

function hex2bin(str)
    local map = {
        ['0'] = '0000'
        ['1'] = '0001'
        ['2'] = '0010'
        - - 等等,一直到 'F'
    }
    return str:gsub('[0-9A-F]', map)
end

请注意,保留了任何无法被解释为十六进制的字符。

2012-02-04 01:20:13
stackoverflow用户513763
stackoverflow用户513763

因为编写一个这样的函数非常简单,所以这里没有提供这样的函数。

function writeHex(str,fh)
    for byte in str:gmatch'%x%x' do
        fh:write(string.char(tonumber(byte,16)))
    end
end

这个函数只是简单地将值写入到文件指针 fh 所指向的文件中。

2012-02-04 08:56:02
stackoverflow用户221509
stackoverflow用户221509

我使用以下函数在十六进制字符串和“原始二进制”之间进行转换:

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!
2012-02-04 10:37:59