如何在C API中创建Python bytes对象

2024-09-27 07:35:41 发布

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

我有一个bools的Numpy向量,我正在尝试使用capi从中尽快获得一个bytes对象。(理想情况下,我希望将向量的二进制值映射到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值。有人有什么建议吗?你知道吗


Tags: 对象numpyifbytes情况byte向量int
1条回答
网友
1楼 · 发布于 2024-09-27 07:35:41

您需要存储刚刚完成的字节。你的问题是你还没有创建一个实际的bytes对象来填充,所以就这样做吧。您知道结果必须是多长时间(bool向量大小的八分之一,向上舍入),所以use ^{}要获得大小正确的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;
}

如果最后一个字节可能不完整,您需要决定如何处理这个问题(pad位是出现在左边还是右边,最后一个字节是否被省略,因此不应该对分配进行四舍五入等等)。你知道吗

相关问题 更多 >

    热门问题