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

Mar*_* C. 6 python python-c-api python-3.x

我有一个 s 的 Numpy 向量,我正在尝试使用 C API尽快从中bool获取对象。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); 
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ger 5

您需要存储刚刚完成的字节。你的问题是你还没有创建一个实际的bytes对象来填充,所以就这样做。您知道结果必须有多长(布尔向量大小的八分之一,向上舍入),因此使用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);
Run Code Online (Sandbox Code Playgroud)

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

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

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