gpt4 book ai didi

python - 如何在 C API 中创建 Python 字节对象

转载 作者:太空宇宙 更新时间:2023-11-04 02:00:09 25 4
gpt4 key购买 nike

我有一个 bool 的 Numpy 向量,我正在尝试使用 C API 尽快从中获取一个 bytes 对象。 (理想情况下,我想将向量的二进制值映射到字节对象。)

我可以成功读入向量,并且我在 bool_vec_arr 中有数据。我想创建一个 int 并以这种方式设置它的位:

PyBytesObject * pbo; 
int byte = 0;
int i = 0;
while ( i < vec->dimensions[0] )
{
if ( bool_vec_arr[i] )
{
byte |= 1UL << i % 8;
}
i++;
if (i % 8 == 0)
{
/* do something here? */
byte = 0;
}
}
return PyBuildValue("S", pbo);

但我不确定如何在pbo 中使用byte 的值。有人有什么建议吗?

最佳答案

您需要存储刚刚完成的字节。你的问题是你还没有制作一个实际的 bytes 对象来填充,所以这样做。你知道结果必须有多长( bool 向量大小的八分之一,四舍五入),所以 use PyBytes_FromStringAndSize获取正确大小的 bytes 对象,然后随时填充它。

你只需分配:

// Preallocate enough bytes
PyBytesObject *pbo = PyBytes_FromStringAndSize(NULL, (vec->dimensions[0] + 7) / 8);
// Put check for NULL here

// Extract pointer to underlying buffer
char *bytebuffer = PyBytes_AsString(pbo);

其中加 7 然后除以 8 舍入以确保您有足够的字节用于所有位,然后在完成一个字节后分配给适当的索引,例如:

if (i % 8 == 0)
{
bytebuffer[i / 8 - 1] = byte; // Store completed byte to next index
byte = 0;
}

如果最后一个字节可能不完整,你需要决定如何处理这个(填充位出现在左边还是右边,最后一个字节是否被省略,因此你不应该将分配四舍五入,等等) .).

关于python - 如何在 C API 中创建 Python 字节对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55876270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com