Из cdata в string

FBenz

Активный
Автор темы
328
40
Версия MoonLoader
Lua:
function events.onSendPlayerSync(data)
end
Как перевести аргумент data в строку lua?
Мой код выдает пустую строку, то бишь "":
Lua:
function events.onSendPlayerSync(data)
    local ffi = require 'ffi'
    require 'lib.samp.synchronization'
    sampAddChatMessage(ffi.string(data, ffi.sizeof(data)), -1)
end
 
Решение
если тебе нужна структура для парсинга:
если просто сохранить, для дальнейшей работы - юзать ffi.copy
если тебе просто вывести адрес надо - tostring(data)

Мой код выдает пустую строку, то бишь ""
тут всё нормально, потому что где-то вначале оказался \0

Aniki

🐰
Администратор
1,225
1,495
Lua:
function events.onSendPlayerSync(data)
end
Как перевести аргумент data в строку lua?
Мой код выдает пустую строку, то бишь "":
Lua:
function events.onSendPlayerSync(data)
    local ffi = require 'ffi'
    require 'lib.samp.synchronization'
    sampAddChatMessage(ffi.string(data, ffi.sizeof(data)), -1)
end
Конечно, это же не строка, а структура
C:
struct PlayerSyncData {
    uint16_t          leftRightKeys;
    uint16_t          upDownKeys;
    union {
        uint16_t        keysData;
        struct SampKeys keys;
    };
    struct VectorXYZ  position;
    float             quaternion[4];
    uint8_t           health;
    uint8_t           armor;
    uint8_t           weapon;
    uint8_t           specialAction;
    struct VectorXYZ  moveSpeed;
    struct VectorXYZ  surfingOffsets;
    uint16_t          surfingVehicleId;
    uint16_t          animationId;
    uint16_t          animationFlags;
}
Чтобы получить одно из полей, можно воспользоваться точкой
Lua:
print(data.moveSpeed.x) -- скорость по оси X
 

FBenz

Активный
Автор темы
328
40
Конечно, это же не строка, а структура
C:
struct PlayerSyncData {
    uint16_t          leftRightKeys;
    uint16_t          upDownKeys;
    union {
        uint16_t        keysData;
        struct SampKeys keys;
    };
    struct VectorXYZ  position;
    float             quaternion[4];
    uint8_t           health;
    uint8_t           armor;
    uint8_t           weapon;
    uint8_t           specialAction;
    struct VectorXYZ  moveSpeed;
    struct VectorXYZ  surfingOffsets;
    uint16_t          surfingVehicleId;
    uint16_t          animationId;
    uint16_t          animationFlags;
}
Чтобы получить одно из полей, можно воспользоваться точкой
Lua:
print(data.moveSpeed.x) -- скорость по оси X
Я прекрасно знаю о типах данных. Мне нужно структуру сdata перевести в строку lua. Написал же.
Придется самостоятельно составлять структуру и совмещать с каждым полем cdata по отдельности? Геморно.
Видел, что ffi.string() делает это. Но в данном случае оно не работает должным образом.
Либо я не понял, что делает ffi.string()
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
если тебе нужна структура для парсинга:
если просто сохранить, для дальнейшей работы - юзать ffi.copy
если тебе просто вывести адрес надо - tostring(data)

Мой код выдает пустую строку, то бишь ""
тут всё нормально, потому что где-то вначале оказался \0
 
Последнее редактирование:
  • Нравится
Реакции: FBenz и xdswd

FBenz

Активный
Автор темы
328
40
Почитал про ffi и теперь везде пытаешься его пихнуть везде куда можно и не можно? 🤣
Я так понял ты это хочешь
Lua:
for k, v in pairs(data) do
    print(k, v)
end
Я так понял, что ты про events.lua не знаешь. Аргумент data в Events.lua - это не таблица lua, а указатель на Struct данного события. Напомню тебе, что если применить к data функцию pairs или ipairs , тебя мунлоадер пошлет далеко с ошибкой, что нет такого метаметода для данной таблицы.
Учи матчасть, а потом высмеивай людей.
Имрингу спасибо.
 
  • Нравится
Реакции: RTD и Refraktor

RTD

Нестандартное звание
Модератор
391
413
Я так понял, что ты про events.lua не знаешь. Аргумент data в Events.lua - это не таблица lua, а указатель на Struct данного события. Напомню тебе, что если применить к data функцию pairs или ipairs , тебя мунлоадер пошлет далеко с ошибкой, что нет такого метаметода для данной таблицы.
Учи матчасть, а потом высмеивай людей.
Имрингу спасибо.
Да был не прав, весь опыт с работой библиотеки samp lua был основан на таблицах. Де-юре это тоже должно было быть таблицей(или хотя бы прилинкована метатаблица к cdata через ffi.metatype), но де-факто не так
Учи матчасть, а потом высмеивай людей.
Какую книжку посоветуешь, дружище? :sneaky: