python - 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
解决方案
好的,找到使用 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'你好世界'
你好
推荐阅读
- javascript - 如何用 Jest 模拟 Knex 的错误?
- javascript - 如果重新加载后立即读取,会报错“Cannot read property'image' of null”
- webpack - 如何为 next.js 启用摇树?
- charts - (Chart.js v2)如何修复非线性 y 轴从 0 到 100 但跳过从 0 到 50 的刻度?
- node.js - 如何在不输入 npx 的情况下运行 NodeJS CLI 工具
- c# - 为什么在添加 ARM 模板项目后 vs 会更改所有项目 guid?
- c++ - 为什么 std::next/prev 不像 std::advance 那样按距离模板化?
- android - Android UI - 使用按钮和文本视图有效地实现中心的圆角矩形形状
- reactjs - VideoJS 程序化播放仅适用于 setTimeout
- javascript - 我在使用 discord.js 制作记分牌时遇到问题