PyBytes_FromString不同的字节数。

问题描述 投票:0回答:1

我有一个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的新手,我想知道是否有更简单的方法。

python c++ python-c-api
1个回答
0
投票

PyBytes_FromStringAndSize 让你通过 NULL 作为第一个参数,在这种情况下,它返回一个未初始化的字节对象(你可以编辑它)。它实际上只是相当于 _PyBytes_FromSize 并让你做第二个选项。


如果你想尝试 "输出迭代器 "选项,那么解决方案是调用 PyBytes_Type:

 PyObject *result = PyObject_CallFunctionObjArgs((PyObject*)&PyBytes_Type, your_iterable, NULL);

任何返回值在0到255之间的iterable都可以使用。你可以选择 PyObject_Call* 你认为最容易使用的方法。

不过我怀疑用CC++写迭代函数会比写循环更麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.