Строка в HEX формате

Leatington

Известный
Автор темы
258
71
Версия MoonLoader
.026-beta
Пытаюсь конвертировать строку в HEX формат:

Lua:
local text = 'Hello world!'
local function to_bytes(text)
    local array = {}
    for i = 1, #text do
        array[(#array + 1)] = string['byte'](text, i)
    end
 
    return array
end
local bytes = to_bytes(text)
local result = ''
for i = 1, #bytes do
    result = (result .. '\\x' .. string['format']('%02X', bytes[i]))
end
print('\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x21')
print(result)

Результат print:
Код:
[19:21:36.758399] (script)    hex.lua: Hello world!
[19:21:36.758399] (script)    hex.lua: \x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x21


Первый результат (если написать вручную) выводит в консоль адекватно, а второй результат (сгенерированный функцией) - нет.
Такое не только с консолью, но и при записи файл (для этого мне и нужно).
 
  • Вау
Реакции: why ega

Lance_Sterling

Известный
801
281
Проблема возникает из-за того, что экранированные последовательности, такие как \xHH, являются специальными символами в строках Lua, которые заменяются соответствующими символами ASCII. Таким образом, когда вы пытаетесь записать строку, содержащую экранированные последовательности, они будут заменены на соответствующие символы, и вы получите неправильный результат.

Чтобы избежать этой проблемы, вы можете записать результат в файл в бинарном режиме, используя функцию io.open с аргументом 'wb' в качестве режима. Например:
Lua:
local file = io.open('output.txt', 'wb')
file:write(result)
file:close()
В этом случае, результат будет записан в файл в бинарном формате, и экранированные последовательности сохранятся в их исходном виде.

Если вы все еще хотите вывести результат в консоль, то можно использовать функцию io.write вместо print, чтобы записать результат в стандартный вывод без замены экранированных последовательностей:
Lua:
io.write(result)
Таким образом, вы сможете вывести результат в консоль в правильном формате.