Мне нужно было создать собственный формат файла со встроенной метаинформацией.Вместо того, чтобы использовать свой собственный формат, я решил просто использовать Lua.
texture
{
format=GL_LUMINANCE_ALPHA;
type=GL_UNSIGNED_BYTE;
width=256;
height=128;
pixels=[[
<binary-data-here>]];
}
texture
- это функция, которая принимает таблицу в качестве единственного аргумента.Затем он ищет различные параметры по имени в таблице и перенаправляет вызов в подпрограмму C ++.Надеюсь, ничего необычного.
Иногда файлы не обрабатываются со следующей ошибкой:
my_file.lua:8: unexpected symbol near ']'
Что здесь происходит?
Есть ли лучший способ хранения бинарных файлов?данные в Lua?
Обновление
Получается, что хранение двоичных данных в Lua-строке нетривиально .Но это возможно при работе с 3 последовательностями.
Длинные строковые литералы не могут иметь встроенную закрывающую длинную скобку (]]
, ]=]
и т. Д.).
Это довольно очевидно.
Длинные строковые литералы формата не могут заканчиваться чем-то вроде ]==
, чтобудет соответствовать выбранному закрывающему-длинному брекету .
Этот более тонкий.К счастью, скрипт не скомпилируется, если все сделано неправильно.
Данные не могут встраивать \n
или \r
.
Встроенная в Lua's обработка в конце строки все испортила.Эта проблема гораздо более тонкая.Скрипт скомпилируется нормально, но выдает неверные данные.0x13 => 0x10, 0x1013 => 0x10 и т. Д.
Чтобы обойти эти ограничения, я разбил двоичные данные на \r
, \n
, а затем выбрал длинная скобка , которая работает, наконец, испускает Lua, который объединяет различные части вместе.Я использовал скрипт, который делает это для меня.
input: XXXX\nXX]]XX\r\nXX]]XX]=
texture
{
--other fields omitted
pixels= '' ..
[[XXXX]] ..
'\n' ..
[=[XX]]XX]=] ..
'\r\n' ..
[==[XX]]XX]=]==];
}