如何逐字节写双值

时间:2011-12-09 23:35:06

标签: lua double byte

我必须与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,

2 个答案:

答案 0 :(得分:0)

Lua有很多可用于此的库。 如果需要生成的字节数组(字符串),string.pack应该这样做;您可以找到Lua for Windows附带的Windows预编译二进制文件。

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

如果你能够,我更强烈建议切换到LuaJIT,一个为Lua提供即时编译器,提供C和组装的功能,速度和范围,但是具有舒适性和灵活性LUA。

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

答案 1 :(得分:0)

我的第一个建议是:尝试找到一个接受代表双精度而不是双精度的字符串的函数。实现lua方面会非常容易,因为你已经拥有writeString - 它可能与此类似:

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

如果您没有该功能,但可以访问dll源,则可以尝试自己添加该功能;它不应该比获取字符串然后在其上调用atof复杂得多。

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

如果dll使用标准格式,例如IEE-754,则格式通常会有来自/两个刻录的文档“翻译”。否则,您可能需要自己开发它们。

问候并祝你好运!

相关问题