Bin To Cee

lua-users home
wiki

bin2c是一個將二進位檔案轉換成C 字元的字串的程式工具,可以透過#include嵌入於C程式中。

描述

bin2c非常實用,例如可用來將Lua位元碼嵌入於C二進位檔案中,但也有其他更通用的用途(例如:嵌入圖形檔)。

來源

Lua發佈套件不再包含bin2c.c,但可以在較早的版本中找到它(例如:Lua 5.0 [1]),以及[LuaBinaries]

bin2c也可以用Lua撰寫。以下的Lua版本旨在成為完整且改良的替換。此程式和它的C輸出都需要Lua 5.1。你可以下載[bin2c.lua],或是直接在下方閱讀。

Lua bin2c重新實作

local description = [=[
Usage: lua bin2c.lua [+]filename [status]

Write a C source file to standard output.  When this C source file is
included in another C source file, it has the effect of loading and
running the specified file at that point in the program.

The file named by 'filename' contains either Lua byte code or Lua source.
Its contents are used to generate the C output.  If + is used, then the
contents of 'filename' are first compiled before being used to generate
the C output.  If given, 'status' names a C variable used to store the
return value of either luaL_loadbuffer() or lua_pcall().  Otherwise,
the return values of these functions will be unavailable.

This program is (overly) careful to generate output identical to the
output generated by bin2c5.1 from LuaBinaries.

https://lua-users.dev.org.tw/wiki/BinTwoCee

Original author: Mark Edgar
Licensed under the same terms as Lua (MIT license).
]=]

if not arg or not arg[1] then
  io.stderr:write(description)
  return
end

local compile, filename = arg[1]:match"^(+?)(.*)"
local status = arg[2]

local content = compile=="+"
  and string.dump(assert(loadfile(filename)))
  or assert(io.open(filename,"rb")):read"*a"

local function boilerplate(fmt)
  return string.format(fmt,
    status and "("..status.."=" or "",
    filename,
    status and ")" or "",
    status and status.."=" or "",
    filename)
end

local dump do
  local numtab={}; for i=0,255 do numtab[string.char(i)]=("%3d,"):format(i) end
  function dump(str)
    return (str:gsub(".", numtab):gsub(("."):rep(80), "%0\n"))
  end
end

io.write(boilerplate[=[
/* code automatically generated by bin2c -- DO NOT EDIT */
{
/* #include'ing this file in a C program is equivalent to calling
  if (%sluaL_loadfile(L,%q)%s==0) %slua_pcall(L, 0, 0, 0); 
*/
/* %s */
static const unsigned char B1[]={
]=], dump(content), boilerplate[=[

};

 if (%sluaL_loadbuffer(L,(const char*)B1,sizeof(B1),%q)%s==0) %slua_pcall(L, 0, 0, 0);
}
]=])

另請參閱


RecentChanges · preferences
編輯 · 歷史
最後編輯為2023年2月4日 下午5:02 GMT (diff)