cffi: Как мне отправить адрес символа строки в функцию C?

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

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

что печатает:

б'елло мир "

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 ответ

Хорошо нашел решение использовать 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"

Другие вопросы по тегам