首页 > 解决方案 > cffi:如何将字符串的字符地址发送到 C 函数?

问题描述

我实际上正在用 cffi 模块编写一个 python 程序来测试我的 C/ASM 库,并且我设法让它工作。但我不知道如何访问字符串中间的字符地址以将其传递给我的 lib 函数。举个例子:

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

打印:

b'你好世界'

b'\x00\x00\x00\x00\x00 世界'

但是我怎样才能测试类似的东西:

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

标签: pythoncffi

解决方案


好的,找到使用 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'你好世界'

你好


推荐阅读