Lua: запись шестнадцатеричных значений в двоичный файл

у меня есть несколько шестнадцатеричных значений, которые я пытаюсь записать в файл. Кажется, что Lua не поддерживает это из коробки, так как все они рассматриваются как строки вместо значений. Я решил, что мне придется разбить более длинное шестнадцатеричное значение, например AABBCC на AA, BB, CC и использовать строку.char () на всех их десятичных значениях последовательно, чтобы выполнить работу.

есть ли встроенная функция, которая позволяет мне писать такие значения напрямую, без преобразования их в первую очередь? Я побег символы, такие как "0xAA" и "xAA", но они не сработали.

Edit: позвольте мне привести вам пример. Я смотрю на тестовый файл в hex редакторе:

00000000  00  00  00  00  00  00  ......

и я хочу написать ему следующим образом со строкой "AABBCC":

00000000  AA  BB  CC  00  00  00  ......

что я получаю, хотя с escape-символами:

00000000  41  41  42  42  43  43  AABBCC

3 ответов


Я использую следующие функции для преобразования между шестнадцатеричной строкой и"raw binary":

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!

Итак, у вас есть строка:

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

обратите внимание, что он оставляет нетронутыми любые символы, которые не могут быть интерпретированы как hex.


существует такая функция, потому что ее легко написать.

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

Это просто записывает значения в файл, на который указывает файловый дескриптор FН.