cffi: как отправить адрес символа строки в функцию C? - PullRequest
0 голосов
/ 04 ноября 2018

На самом деле я пишу программу на python с модулем cffi для тестирования моей библиотеки C / ASM, и мне удалось заставить ее работать. Но я не знаю, как получить доступ к адресу символа в середине строки, чтобы передать его в мою функцию lib. Для примера:

def my_bzero_test():
   str = b"hello world"
   print(str)
   lib.ft_bzero(str, 5)
   print(str)

, который печатает:

b'hello world '

b '\ x00 \ x00 \ x00 \ x00 \ x00 world'

Но как я могу проверить что-то вроде:

def my_bzero_test():
   str = b"hello world"
   print(str)
   lib.ft_bzero(str + 5, 5) # C-style accessing &str[5]
   print(str)

Я пробовал разные вещи, например:

def my_bzero_test():
    str = ctypes.create_string_buffer(b"hello world")
    addr = ctypes.addressof(str)
    print(hex(addr))
    print(str)
    lib.ft_bzero(addr + 5, 5)
    print(str)

выход:

TypeError: инициализатор для ctype 'void *' должен быть указателем cdata, а не int

также пытался с id (), но безуспешно ...

Я не очень знаком с python, но мне кажется, что это не тривиальное использование, поэтому небольшая помощь здесь будет принята, спасибо!

Python 3.7.0

1 Ответ

0 голосов
/ 05 ноября 2018

ок нашел решение, используйте ffi.new () и ffi.tostring ()

str = ffi.new("char[]", b"hello world")
print(ffi.string(str))
lib.ft_bzero(str + 5, 5)
print(ffi.string(str))

выход:

b'hello world '

b'hello '

...