【问题标题】:Passing a byte array to a C++ function that accepts a void pointer将字节数组传递给接受 void 指针的 C++ 函数
【发布时间】:2017-09-12 08:29:31
【问题描述】:

我正在使用 boost::python 导出一些需要 void* 的 C++ 函数。他们在内部将其解释为原始内存(字节数组)。想想readwrite 一些非常特殊用途的设备。

如何将 Python bytearray 传递给这样的函数?

我尝试过使用ctypes.c_void_p.from_buffer(mybytearray),但这与函数的签名不匹配。

这是最小的例子:

#include <boost/python.hpp>

void fun_voidp(void*) {}

BOOST_PYTHON_MODULE(tryit) {
    using namespace boost::python;
    def("fun_voidp", fun_voidp);
}

在 python 端:

import tryit
import ctypes
b = bytearray(100)
tryit.fun_voidp(b) # fail
tryit.fun_voidp(ctypes.c_void_p.from_buffer(b)) # fail
tryit.fun_voidp(ctypes.c_void_p.from_buffer(b).value) # fail

【问题讨论】:

    标签: python boost


    【解决方案1】:

    我非常愿意修复函数原型以采用 char* 并使用最后一行 python。

    没有理由在 C++ 中使用 void*。我知道 API 是否可以,但用您自己的函数包装它应该不难。

    【讨论】:

    • 这是一个被其他项目使用的遗留 API,改变它是不可能的,并且包装它会破坏按原样导出它的想法。我可以将它包装在一个接受 python 对象的函数中......
    • “打败了这个想法”——这个想法的实际价值是什么? (诚​​实的问题)
    • 这样的函数有很多,为每个函数编写一个包装器将是很多工作。也许无论如何我都会走这条路,使接口更符合 Python 的习惯(即返回一个新的字节数组,而不是将一个字节数组作为参数并填充它)。我仍然想知道是否可以选择使用带有 boost 的void* 字节数组(例如,使用 ctypes 可以轻松做到这一点)。
    猜你喜欢
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2021-04-15
    • 2011-03-20
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多