Передача байтовой строки от Python до C - PullRequest
1 голос
/ 13 февраля 2020

Я пишу расширение python в C и пытаюсь передать объект байтов в мою функцию. Очевидно, что токен 's' предназначен для строк; Я попробовал «О», «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("device", f.read(32)).

1 Ответ

1 голос
/ 13 февраля 2020

Если вы читаете документы формата в формате docs , это довольно ясно.

s предназначен исключительно для получения строки C в стиле *1024* с кодировкой UTF-8 в конце. из str объекта (поэтому он подходит для вашего первого аргумента, но не для вашего второго).

y* специально вызывается в документах с (выделено в оригинальном тексте):

Это рекомендуемый способ приема двоичных данных.

y# также будет работать, за счет того, что вызывающий абонент должен предоставить неизменяемый bytes - как объекты, исключая такие вещи, как bytearray и mmap.mmap s.

...