【问题标题】:cffi: How do i send the address of a character of a string to a C function?cffi:如何将字符串的字符地址发送到 C 函数?
【发布时间】:2019-04-08 00:27:58
【问题描述】:

我实际上正在编写一个带有 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

【问题讨论】:

  • 不要编辑问题的答案;将其发布为答案。

标签: python cffi


【解决方案1】:

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

b'你好'

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2010-10-13
    • 1970-01-01
    • 2023-04-11
    • 2012-02-17
    相关资源
    最近更新 更多