代码之家  ›  专栏  ›  技术社区  ›  deft_code

如何在Lua字符串中存储二进制数据

  •  1
  • deft_code  · 技术社区  · 15 年前

    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中存储二进制数据?


    更新

    non-trivial . 但在处理3个序列时是可能的。

    • Long-format-string-literals 不能有嵌入的 闭合长括号 ( ]] ]=] 等)。
      这个很明显。

    • ]== 与所选的匹配 闭合长括号 .

    • 数据无法嵌入 \n \r .
      built in line-end processing 把这些搞砸了。这个问题要微妙得多。这个脚本可以很好地编译,但会产生错误的数据。0x13=>0x10、0x1013=>0x10等。

    \右 , \不 长括号 这样的话,最终会发射Lua,将各个部分连接在一起。我用了一个脚本来帮我。
    输入: XXXX\nXX]]XX\r\nXX]]XX]=

    texture
    {
      --other fields omitted      
      pixels= '' ..
         [[XXXX]] ..
         '\n' ..
         [=[XX]]XX]=] ..
         '\r\n' ..
         [==[XX]]XX]=]==];
    }
    
    2 回复  |  直到 5 年前
        1
  •  3
  •   gwell    15 年前

    Char code(s)      Problem
    --------------    -------------------------------
    13 (CR)           Is translated to 10 (LF)
    13 10 (CR LF)     Is translated to 10 (LF)
    26 (EOF)          Causes "unfinished long string near '<eof>'"
    

    如果您不使用windows,这些可能不会导致问题,但可能会有基于不同文本模式的问题。


    a=[[
    ]]] --> a.lua:2: unexpected symbol near ']'
    

    但是,这很容易通过以下方法解决:

    a=[==[
    ]]==]
    
        2
  •  1
  •   Judge Maygarden    15 年前

    C-like escape sequences 对于所有字节。例如,十六进制字节 13 41 42 1E 将被编码为“\19\65\66\30”。当然,编码后的数据比源二进制文件大三到四倍。

    Base64 ,但这必须在运行时解码,而不是依赖Lua解释器。就我个人而言,我可能会选择Base64路线。有 Lua examples of Base64 encoding and decoding .

    TGA )它由一个单独的Lua脚本和附加的元数据指向。如果您不希望两个文件移动,那么可以将它们合并为一个文件 archive .