我有一个Python封装的C++对象,它的底层数据是一个容器。std::vector<T>
表示比特。我有一个函数将这些比特写入一个PyBytes对象。如果endianness是相同的,那么就没有问题。然而,如果我希望以不同的字节写在不同的endianness中,那么我需要对每个字进行bitswap(或byteswap)。
理想的情况是,我可以将一个输出迭代器传递给 PyBytes_FromString
构造函数,其中输出操作符只是转换每个词的endianness。这将是 O(1)
额外的内存,这就是目标。
不太理想的情况下,我可以以某种方式构造一个空的PyBytes对象,并创建不同的字节的 char
数组,并以某种方式将其分配给PyBytes对象(基本上是重新实现了 PyBytes构造函数). 这也将是 O(1)
额外的内存。不幸的是,要做到这一点的方法是使用 _PyBytes_FromSize
但这在API中是不可用的。
目前的方法是创建一个完整的反转词副本,只是为了将该表示法复制到PyBytes对象的表示法上。
我认为第二种方案是最实用的方法,但我能看到的唯一工作方式是基本上复制了 _PyBytes_FromSize
函数到我的源代码中,这似乎是个黑客。我是python-C api的新手,我想知道是否有更简单的方法。
PyBytes_FromStringAndSize
让你通过 NULL
作为第一个参数,在这种情况下,它返回一个未初始化的字节对象(你可以编辑它)。它实际上只是相当于 _PyBytes_FromSize
并让你做第二个选项。
如果你想尝试 "输出迭代器 "选项,那么解决方案是调用 PyBytes_Type
:
PyObject *result = PyObject_CallFunctionObjArgs((PyObject*)&PyBytes_Type, your_iterable, NULL);
任何返回值在0到255之间的iterable都可以使用。你可以选择 PyObject_Call*
你认为最容易使用的方法。
不过我怀疑用CC++写迭代函数会比写循环更麻烦。