Как записать двойное значение побайтно - PullRequest
1 голос
/ 10 декабря 2011

Я должен общаться с 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 голосов
/ 10 декабря 2011

Моя первая рекомендация: попробуйте найти функцию, которая принимает строки, представляющие двойные числа вместо двойных.Реализовать сторону lua это было бы невероятно легко, поскольку у вас уже есть writeString - это может быть что-то очень похожее на это:

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

Если у вас нет этой функции, но у вас естьдоступ к источнику DLL, вы можете попробовать добавить эту функцию самостоятельно;это не должно быть намного сложнее, чем получить строку и затем вызвать на ней atof .

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

Если dll использует стандартный формат, такой как IEE-754 , формат обычно имеет хорошо документированные «переводы» с / двух фрагментов.В противном случае, возможно, вам придется разрабатывать их самостоятельно.

С уважением и удачи!

0 голосов
/ 10 декабря 2011

Для Lua доступно множество библиотек, которые делают именно это.Если вам нужен результирующий байтовый массив (строка), string.pack должен это сделать;Вы можете найти предварительно скомпилированные двоичные файлы для Windows, включенные в Lua для Windows .

Если вы более заинтересованы в использовании double для взаимодействия с сторонним кодом, я бы рекомендовал использовать другой подход, используя alien , библиотека интерфейса внешних функций, которая позволяет напрямую вызывать функции C.

Если вы можете, я даже более настоятельно рекомендую переключиться на LuaJIT , Just-In-Компилятор времени для Lua, который обеспечивает мощность, скорость и охват C и сборки, но с комфортом и гибкостью Lua.

Если ни одно из этих решений не является жизнеспособным, я могу предоставить некоторый код для сериализации дубликатов (недоступно на данный момент).

...