Здравствуйте, гость ( Вход | Регистрация )

> lua, readmem, unicode, Считать из памяти строку в формате UTF-16
фонарик
сообщение 19.2.2024, 14:37
Сообщение #1


****

Apprentice
Сообщений: 162
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



Здравствуйте. Не знаю правильно ли я думаю, но пилот не умеет понимать строку в юникоде. Из интернетов были добыты эльфийские инструменты плагины, которые (если судить по светящимся надписям на них) как раз созданы магами-чародеями программистами для таких задач. Но тут вспоминается басня Крылова "Мартышка и очки". На рабочем столе уже не осталось места для размещения очередного артефакта. И вот в печалях, в довлеющем ощущении тяжести и бренности бытия, спешу я снова к вам в лавку алхимиков на форум за советами и помощью.

Вот, например, у одного человека, создаваемый велосипед заканчивается чтением памяти:
Код
Name = readmem ("0x07CCFFD8", "S", 16)
В Name записывется какое-то нечто, вообще не связанное с реальностью. По данному адресу находится:
Код
1D 04 30 04 31 04 3E 04 40 04
что в переводе с древнего наречья с UTF-16 читается как слово "Набор".

То ли я где-то прочёл, то ли кто-то сказал, но я почему-то знаю что необходимо обзавестись синей изолентой плагином, который нужно правильно причесать, положить в правильное место и создать заклинание на ассемблере правильную функцию, которая и считает из памяти всё в правильном виде. Но без вашей помощи мне не справится, я вообще даже не понимаю, правильно ли я в Воронеж ехал сделал ли я хоть что-то правильное в своих попытках. Пожалуйста, поделитесь советом, как же всё-таки данные из памяти правильно приготовить? Легенды гласят, доподлинно известно, что это строка в кодировке UTF-16.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
Aqualon
сообщение 20.2.2024, 2:34
Сообщение #2


**

Neophyte
Сообщений: 23
Регистрация: 21.3.2023
Группа: Пользователи
Наличность: 0
Пользователь №: 20.503
Возраст: 22



Если вам просто надо спарсить utf8 строку из памяти, я для такого пользовался примерно таким ужасом, но сетапится этот ужас относительно просто
Код

-- либу с утф возьмите отсюда
-- https://github.com/Stepets/utf8.lua
utf8 = require('lua/utf8')
-- Я могу ошибаться, но лично у меня этот файлик лежал по этому пути.
-- Тут лежат функции для конвертации из utf8 в win кодировки и обратно
require('lua/win-125x')

function utf8_from(t)
  local bytearr = {}
  for _, v in ipairs(t) do
    local utf8byte = v < 0 and (0xff + v + 1) or v
    table.insert(bytearr, utf8.char(utf8byte))
  end
  return table.concat(bytearr)
end

function parseUnicodeStringFromMemory(startAddr)
    -- максимальное количество символов, поставьте нужное вам, это чисто оградка.
    -- Если строка ваша null-terminated, вернёт он именно ту что вам нужна.
    local UPPER_BOUND = 20
    local result = {}

    for i = 1, UPPER_BOUND do
        local step = 0x2 * (i - 1)

        local char = readmem(startAddr + step, 'w')

        if char == 0 then break end

        table.insert(result, char)
    end

    return utf8_to_win(utf8_from(result))
end
-- Пример использования в вашем случае, адрес взял у вас из топика
local name = parseUnicodeStringFromMemory(0x07CCFFD8)
log(name)

Безусловно, вышеописанный ужас не заменит нормальную поддержку ридмема с utf8, но это рабочее решение с минимумом дополнительных действий.
Я со временем вообще ушёл от работы со строками, особенно с utf строками, для тех мест где нужна человеческая читаемость я замапил айдишники с вручную выписанными пояснениями в отдельном файлике с константами, это убирает кучу геморроя.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
фонарик   lua, readmem, unicode   19.2.2024, 14:37
DarkMaster   Задача именно работать с юникодом или просто счита...   19.2.2024, 15:37
фонарик   Задача именно работать с юникодом или просто счит...   19.2.2024, 15:43
DarkMaster   --lua log"clear" local ffi = require...   19.2.2024, 16:01
фонарик   Тебя интересует функция export.unicode(address, le...   19.2.2024, 16:22
DarkMaster   никаких кавычек. значения переданы верно. рабочее ...   19.2.2024, 16:25
фонарик   никаких кавычек. значения переданы верно. рабочее ...   19.2.2024, 16:27
DarkMaster   считай как string. есть зябрики?   19.2.2024, 16:29
фонарик   А еще в логе перед строкой с nil есть строка с соо...   19.2.2024, 16:30
DarkMaster   --lua log"clear" local ffi = require...   19.2.2024, 16:36
фонарик   что в логе теперь? 16:37:50 70 (, 0...   19.2.2024, 16:38
DarkMaster   --lua log"clear" local ffi = require...   19.2.2024, 16:42
фонарик   Пробуй. Там читалось окно пилота =) я тестил то на...   19.2.2024, 16:48
DarkMaster   Это больше спасибо cirus и Cockney, которых я сего...   19.2.2024, 16:50
фонарик   Это больше спасибо cirus и Cockney, которых я сего...   19.2.2024, 17:05
DarkMaster   естественно просмотрел. добавьте в конце моего скр...   19.2.2024, 17:26
фонарик   Ну вот, вообще теперь красота :lol: Здоровья и мир...   19.2.2024, 17:42
DarkMaster   А теперь немного о быдло коде =) Меня очень сильно...   19.2.2024, 18:52
Cockney   Так какой вопрос то ?) Тут поинт в том, что два...   19.2.2024, 19:25
DarkMaster   Ну вроде как да, по логике... Но проверка идет то...   19.2.2024, 19:31
Cockney   В общем случае думаю что не прокатит, т.к. там не ...   19.2.2024, 20:02
DarkMaster   Можно этот момент поподробнее? Там есть какие-то ...   22.2.2024, 16:42
Cockney   Ну, а какие там стандарты...из описания функция ...   22.2.2024, 20:40
DarkMaster   имелось ввиду возможность прочитать объявленный п...   12.3.2024, 18:44
Cockney   тут лучше на примерах, задача то какая ? пока я то...   12.3.2024, 22:21
DarkMaster   опыт с финдимиджем показал, что malloc столько жр...   13.3.2024, 18:12
Cockney   короче как я понял ты костылишь сериализатор/десер...   15.3.2024, 21:20


Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 24.11.2025, 17:40
Designed by Nickostyle