将字节字符串从 Python 传递到 C

Passing byte string from Python to C

我正在用 C 编写一个 python 扩展,我正试图将一个字节对象传递给我的函数。显然 's' 标记用于字符串;我已经尝试了 'O'、'N' 和其他几个,但都没有成功。是否有可用于解析字节对象的标记?如果没有,是否有另一种方法来解析字节对象?

static PyObject *test(PyObject *self, PyObject *args)
{
    char *dev;
    uint8_t *key;

    if(!PyArg_ParseTuple(args, "ss", &dev, &key))
        return NULL;

    printf("%s\n", dev);

    for (int i = 0; i < 32; i++)
    {
          printf("Val %d: %d\n", i, key[i]);
    }

    Py_RETURN_NONE;
}

来自 python 的呼叫:test(b"device", f.read(32))

如果你看了parsing format string docs,就很清楚了。

s 仅用于从 str 对象获取 NUL 终止的 UTF-8 编码的 C 样式字符串(因此它适用于您的第一个参数,但不适用于您的第二个参数).

y* 在文档中特别调用(在原文中强调):

This is the recommended way to accept binary data.

y# 也可以工作,但代价是要求调用者提供不可变的 bytes 类对象,不包括 bytearraymmap.mmap 之类的东西。