PyBytes_from字符串的不同尾数

2024-10-01 07:38:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python包的C++对象,其基础数据是一个容器,{{CD1.}}表示比特。我有一个函数将这些位写入PyBytes对象。如果endianness是相同的,那么就没有问题了。但是,如果我希望以不同的尾数写入字节,那么我需要对每个字进行位交换(或字节交换)

理想情况下,我可以将一个输出迭代器传递给PyBytes_FromString构造函数,其中输出操作符只转换每个单词的endianness。这将是O(1)额外的内存,这是目标

不太理想的情况是,我可以以某种方式构造一个空的PyBytes对象,手动创建不同的endiannesschar数组,并以某种方式将其分配给PyBytes对象(基本上是重新实现PyBytes constructors)。这也将是O(1)额外的内存。不幸的是,实现这一点的方法是使用_PyBytes_FromSize,但API中没有这种方法

当前的方法是创建反转单词的完整副本,然后将该表示复制到PyBytes对象表示

我认为第二种选择是实现这一点的最实际的方法,但我能看到工作的唯一方法是基本上将_PyBytes_FromSize函数复制到我的源代码中,这看起来很粗糙。我是python-CAPI新手,不知道是否有更干净的方法来实现这一点


Tags: 数据对象方法函数内存字节方式情况
1条回答
网友
1楼 · 发布于 2024-10-01 07:38:53

^{}允许您将NULL作为第一个参数传递,在这种情况下,它返回一个未初始化的字节对象(您可以编辑)。它实际上相当于_PyBytes_FromSize,可以让您进行第二个选择


如果您想尝试“输出迭代器”选项,那么解决方案是调用PyBytes_Type

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

任何返回0到255之间的值的iterable都应该工作。您可以选择最容易使用的PyObject_Call*

我怀疑用C/C++编写iterable比编写循环要麻烦得多

相关问题 更多 >