我一直在尝试反编译一个LuaJIT字节码文件.我设法拆卸它(但找不到任何方法重新组装它).所以我正在考虑编写一些软件来从LuaJIT字节码转换为标准的Lua字节码,然后通过LuaDec很好地运行.
但是LuaJIT字节码和标准Lua字节码之间有什么区别?
用luajit查看默认的Lua cpath:
luajit -e "print(package.cpath)"
我明白了:
./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/luajit/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so
这是什么目的loadall.so?它实际上并不存在于我的Linux系统上.
我有很多c ++代码,在命名空间中包含很多函数和类(例如,boost).
现在我试图将LuaJiT2作为脚本引擎嵌入,但我找不到任何关于调用函数和使用命名空间中的其他东西的东西.
那么,是否可以使用FFI将函数从c ++命名空间传递给LuaJIT?
我正在编写一个需要在LuaJit中读取一些复杂二进制消息的小应用程序.
我一直在使用bit模块和string.rep.然而,这一切都非常麻烦.我是使用LuaJit的新手,并认为使用FFI可能会有更简单的方法.
在CI中可以声明这样的结构:
struct mystruct
{
uint32_t field1;
char field2[6];
uin64_t field3;
short field4;
} __attribute__(packed);
Run Code Online (Sandbox Code Playgroud)
在阅读LuaJit的FFI时,你似乎可以宣布
ffi.cdef[[
#pragma pack(1)
struct mystruct
{
uint32_t field1;
char field2[6];
uin64_t field3;
short field4;
};
]]
Run Code Online (Sandbox Code Playgroud)
然后我可以创建一个mystruct并访问这样的字段:
local ms = ffi.new("mystruct")
ms.field1 = 32;
// ... etc
Run Code Online (Sandbox Code Playgroud)
但是,如何将其转换为lua字符串?
我尝试了这个,但它似乎没有做我想要的.
local s = tostring(ms)
Run Code Online (Sandbox Code Playgroud)
还有这个:
local s = ffi.string(ms)
Run Code Online (Sandbox Code Playgroud)
产生以下错误"错误的参数#1到'字符串'(不能将'struct mystruct'转换为'const char*')"
所以我试了一个演员:
local s = ffi.string(ffi.cast("char*", ms))
Run Code Online (Sandbox Code Playgroud)
没有错误,但它在电线上看起来不对.
在Windows中,我想知道是否有一种使用LuaJIT的等效方式,如标准的Lua分发wlua.exe,它是无窗口的.或者我应该编译模块并在标准的Lua解释器中使用它们?(不确定这是否可行).
我对使用 定义的用户数据有疑问ffi.metatype。当对象被垃圾收集时,我会遇到段错误。这是代码。
ffi = require("ffi")
srate = 48000
ffi.cdef[[
typedef struct sin_state {
float _now; // time of last eval
float _last; // result of last eval
float _freq; // frequency
float _gain; // gain
float _phase; // phase
float _w; // angular speed in radians/sample
float _p; // update parameter
float _y[3]; // last 3 steps
} sin_t;
]]
sin = {}
sin.mt = {
__call = function(s,now)
if s._now < now then
s._now = now
s._phase …Run Code Online (Sandbox Code Playgroud) 我在文档中看到ffi.C.free是我可以用来释放malloc的东西.我试图在这里这样做:
callbacks.free_buffer = function(buffer)
print("free_buffer_callback")
ffi.C.free(buffer)
end
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
missing declaration for symbol 'free'
Run Code Online (Sandbox Code Playgroud)
这是否意味着我必须首先使用FFI来记忆内存?我不能在这个特定的函数中做到这一点(因为它是回调中的参数).我该怎么做才能释放这个缓冲区?
编辑:看起来所有的ffi.C函数都不起作用,即使在回调函数之外也是如此.我的ffi似乎工作正常吗?
标题说明了,如何更改Torch REPL中的工作目录?我尝试使用os.execute('cd some_dir')调用,但这不起作用,如此处所示.
th> pwd()
--prints:/ home/user/Code
th> os.execute('cd ..')
--prints:true exit 0
th> pwd()
- print:/ home/user/Code
其中pwd()是一个调用os.execute('pwd')的便捷函数.
我已经使用luajit ffi库来包装一个C库,其中包含一个在ppm文件上绘制文本的函数:
void drawText(frameBuffer *fb, int px, int py, char* text, pixel color)
Run Code Online (Sandbox Code Playgroud)
当我尝试使用字符串从lua调用它时,我收到此错误bad argument #4 to 'drawText' (cannot convert 'string' to 'char *').它看起来不像lua字符串库有任何东西可以将整个字符串转换为字节数组或任何我可以充分操作的东西.
有关如何在没有修改C代码的情况下在lua端执行此操作的任何提示?
当我使用dolua 关键字作为表的键时,会出现以下错误
> table.newKey = { do = 'test' }
stdin:1: unexpected symbol near 'do'
>
Run Code Online (Sandbox Code Playgroud)
我需要用作do密钥。我应该怎么办 ?