Germany | Finland | Saint Petersburg | Drive

Как упаковать бинарный файл в lua скрипт?

Опубликовано в M4

Иногда необходимо упаковать несколько бинарных файлов в тело скрипта на lua с тем, чтобы в процессе работы можно было создать этот файл в нужном месте.

1. Необходимо преобразовать двоичный файл в строку синтаксиса Lua. Для этого пишем простенькую консольную программку на С и назовем её Include_Bin:

#include "stdafx.h"
#include <cctype>
#include <fcntl.h>
#include <io.h>
int _tmain()
{
    int ch;
    char buffer[5];
    _setmode(_fileno(stdin), _O_BINARY);
    fputc('`',stdout);
    for (;;)
    {
        ch = fgetc(stdin);
        if (ch == EOF)
             break;
        if (isalpha(ch))
             fputc(ch,stdout);
        else
        {
              sprintf_s(buffer,sizeof(buffer),"\\%u",ch);
              fputs(buffer,stdout);
        }
    }
    fputc('\'',stdout);
    return 0;
}

Она принимает на входе (stdin) исходный двоичный файл, на выходе (stdout) выдает его содержимое строкой синтаксиса Lua.

2. Пишем макрос для M4, который запускает эту программу, натравливает её на нужный нам файл и забирает стандартный вывод

define(`includebinary',`"esyscmd(Include_Bin.exe <`$1')"')

3. Добавляем поддержку в lua.

create_image = function(string_image,filename)
    local f,err = io.open(filename,"wb")
    if not f then
       return nil,err
    end

    f:write(string_image)
    f:close()
    return filename
end

Собственно, все.

 

 


 

Чтобы на этапе компоновки lua скрипта включить в его тело двоичный файл, указываем

local binary = includebinary(binary.file)

В скомпилированом lua-скрипте эта конструкция развернется примерно в следующее:

local binary = "\0\1\2\3"

 

Теперь, чтобы во время исполнения скрипта создать в нужном месте этот файл

create_image(binary,"d:\\path\\binary_new.file")

 

Добавить комментарий


Библиотека