2011-12-09 21 views
1

双值字节我有一个DLL,它LUA进行沟通,这是我用要写入的字节字符串的函数:怎样写由字节

writeString = function(pid, process, address, value) 
     local i = 1 
     while i <= String.Length(value) do 
      local byte = string.byte(value, i, i) 
      DLL.CallFunction("hook.dll", "writeMemByte", pid..','..process..','..address + (i-1)..','..byte, DLL_RETURN_TYPE_INTEGER, DLL_CALL_CDECL) 
      i = i + 1 
     end 
     DLL.CallFunction("hook.dll", "writeMemByte", pid..','..process..','..address + (i-1)..',0', DLL_RETURN_TYPE_INTEGER, DLL_CALL_CDECL) 
    end 

基本上,我需要去适应这个写一个字节的双倍值。 我只是想不出如何使memory.writeDouble函数。

编辑:这是我的readString功能:

readString = function(pid, process, address) 
     local i, str = 0, "" 
     repeat 
      local curByte = DLL.CallFunction("hook.dll", "readMemByte", pid..','..process..','..(address + i), DLL_RETURN_TYPE_INTEGER, DLL_CALL_CDECL) 
      if curByte == "" then curByte = 0 end 
      curByte = tonumber(curByte) 
      str = str .. string.char(curByte) 
      i = i + 1 
     until (curByte == 0) 
     return str 
    end, 

回答

0

我的第一个建议是:尝试找到一个函数接受代表双打而不是双打的字符串。贯彻了LUA方面将是令人难以置信的容易,因为你已经有了一个writeString - 它可以是非常类似的措施:

writeDouble = function(pid, process, address, value) 
    writeString(pid, process, address, tostring(value)) 
end 

如果你没有这样的功能,但你必须访问的dll源,你可以尝试自己添加该功能;它不应该比得到字符串更复杂,然后在其上调用atof

如果你真的无法修改dll,那么你需要找出lib所期待的确切的双重格式 - 有很多因素可以改变这种格式。使用的语言和编译器,操作系统和编译器标志引用了一些。

如果dll使用标准格式,如IEE-754,格式通常会有很好的文档“/ translations/from/bites”。否则,你可能需要自己开发它们。

问候并祝你好运!

+0

谢谢,这是一个很好的答案,我会研究这些选项。 – Syntax

0

有迹象表明,这样做只是这可用于Lua的许多图书馆。 如果您需要生成的字节数组(字符串),string.pack应该这样做;您可以找到Lua for Windows附带的Windows预编译二进制文件。

如果您对使用double与外部代码接口更感兴趣,我会建议您采用不同的方法,使用alien,这是一个允许您直接调用C函数的外部函数接口库。

如果可以的话,我甚至更强烈建议转换为Lua的Just-In-Time编译器LuaJIT,该编译器提供了C和汇编的功能,速度和覆盖范围,同时还提供了Lua的灵活性。

如果这些解决方案都不可行,我可以提供一些代码来串行化双打(目前无法访问)。

+0

如果你可以找到序列化双精度的代码,我会非常感谢它,我会研究这些库,但它只是程序的一小部分,我宁愿不添加一个完整的库。 – Syntax