【发布时间】:2010-09-28 17:02:00
【问题描述】:
我需要创建一个包含嵌入元信息的自定义文件格式。我决定只使用 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字符串是non-trivial。但是在处理 3 个序列时是可能的。
-
Long-format-string-literals 不能有嵌入的 close-long-bracket(
]]、]=]等)。
这个很明显。 -
Long-format-string-literals 不能以
]==之类的结尾,这将匹配所选的 closure-long-bracket。
这个比较微妙。幸运的是,如果执行错误,脚本将无法编译。 -
数据不能嵌入
\n或\r。
Lua 的built in line-end processing 把这些搞砸了。这个问题要微妙得多。该脚本可以正常编译,但会产生错误的数据。 0x13 => 0x10、0x1013 => 0x10 等
为了解决这些限制,我将二进制数据拆分为\r、\n,然后选择一个有效的长括号,最后发出将各个部分连接在一起的 Lua。我使用了一个为我执行此操作的脚本。
输入:XXXX\nXX]]XX\r\nXX]]XX]=
texture
{
--other fields omitted
pixels= '' ..
[[XXXX]] ..
'\n' ..
[=[XX]]XX]=] ..
'\r\n' ..
[==[XX]]XX]=]==];
}
【问题讨论】:
-
您确定您的二进制数据不包含任何可能被读取为 ']]' 的内容吗?
-
我检查了,像素数据中没有'
]]'。
标签: string lua binary-data