Вопросы по использованию FFI
- John Doe
- Бюрократ
- Posts: 13553
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 67 times
- Been thanked: 390 times
- Contact:
Вопросы по использованию FFI
FFI — одна из стандартных библиотек luajit.
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI
Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610
Примеры готовых скриптов:
Предупреждение: viewtopic.php?p=147610#p147610
Позволяет из Lua кода вызывать внешние C-функции и использовать структуры данных C.
В данной теме задаём вопросы по использованию FFI
Заготовка для документации: viewtopic.php?f=57&t=8418&p=147610#p147610
Примеры готовых скриптов:
Предупреждение: viewtopic.php?p=147610#p147610
- John Doe
- Бюрократ
- Posts: 13553
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 67 times
- Been thanked: 390 times
- Contact:
Вопросы по использованию FFI
В данном случае из контекста неясно как в дальнейшем будет использоваться
Params
, и учитывая что размер массива указан фиксированный я намеренно использовал string
, т.к. в противном случае любое не ascii значение даст другую длину.
Last edited by John Doe on Fri 26 May, 2023 10:05, edited 1 time in total.
https://t.me/FarManager — Telegram чат
- buniak_a_h
- Posts: 3969
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 204 times
- Been thanked: 597 times
- Contact:
Вопросы по использованию FFI
В процедуре сортировки я написал такое:
Вроде, работает…
Code: Select all
local U8 = win.Utf16ToUtf8
local function String(cStr)
if tostring(cStr) == "cdata<const unsigned short *>: NULL" then return nil end
return U8(ffi.string(cStr,C.wcslen(cStr)*wsize))
end
- John Doe
- Бюрократ
- Posts: 13553
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 67 times
- Been thanked: 390 times
- Contact:
Вопросы по использованию FFI
Если это ваш ответ на задачу с прошлой страницы, то похоже не в тему.
Разве так не работает?Code: Select all
if tostring(cStr) == "cdata<const unsigned short *>: NULL" then return nil end
Code: Select all
if cStr==nil then return nil end
https://t.me/FarManager — Telegram чат
Вопросы по использованию FFI
Идем дальше
return cStr and U8(ffi.string(cStr,C.wcslen(cStr)*wsize))
?
почему не написать:
return cStr and U8(ffi.string(cStr,C.wcslen(cStr)*wsize))
?
SimSU ··· ·· -- ··· ··-
Вопросы по использованию FFI
Я использовал такой способ:
str = "abcdefABCDEF" local Params = ffi.new("WORD["..string.len(str).."]", string.byte(str,1,string.len(str)))
Спасибо за ответ, но есть нюанс, в ffi.new есть указатель WORD, то есть нужно как-то из string.byte в string.word, но такую функцию не нашел.
Может быть есть другое решение, чтобы по два байта?
(p.s. я признаю ошибку, что в прошлом тесте не показал более точный пример, а именно двухбайтовые hex:
Local Params = ffi.new("WORD[6]", 0x0061,0x0062,0x0063,0x0430, 0x0431, 0x0432) -- abcабв
Last edited by Ultrabyte on Fri 19 May, 2023 23:56, edited 1 time in total.
- John Doe
- Бюрократ
- Posts: 13553
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 67 times
- Been thanked: 390 times
- Contact:
Вопросы по использованию FFI
Наверняка есть. Но чтобы на эту тему можно было предметно продолжать, желательно видеть больше контекста.
Т.е. почему именно такой формат данных и как он используется далее.
https://t.me/FarManager — Telegram чат
Вопросы по использованию FFI
Там использую функцию winAPI и входные данные строго UTF16.
Я предварительно конечно преобразую Utf8ToUtf16
Код рабочий, если руками прописывать 0x0061,0x0062,0x0063,0x0430, 0x0431, 0x0432 и т.д.Nabor = win.Utf8ToUtf16("abcабв")
Осталось немного - это двухбайтовые String. Казалось изящное решение где-то близко, но ускользает..
Last edited by Ultrabyte on Sat 20 May, 2023 00:05, edited 3 times in total.
- John Doe
- Бюрократ
- Posts: 13553
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 67 times
- Been thanked: 390 times
- Contact:
Вопросы по использованию FFI
Выше Shmuel уже предлагал использовать
utf8.byte
, вроде бы как раз то чего вы хотите.https://t.me/FarManager — Telegram чат