4

我正在编写一个 Python ( 2.6 ) 扩展,并且我需要将一个不透明的二进制 blob(带有嵌入的空字节)传递给我的扩展。

这是我的代码片段:

from authbind import authenticate

creds = 'foo\x00bar\x00'
authenticate(creds)

抛出以下内容:

TypeError: argument 1 must be string without null bytes, not str

下面是一些 authbind.cc:

static PyObject* authenticate(PyObject *self, PyObject *args) {

    const char* creds;

    if (!PyArg_ParseTuple(args, "s", &creds))
        return NULL;
}

到目前为止,我已经尝试将 blob 作为原始字符串传递,例如creds = '%r' % creds,但这不仅为我在字符串周围提供了嵌入的引号,而且还将\x00字节转换为它们的文字字符串表示形式,我不想在 C 中搞乱。

我怎样才能完成我所需要的?我知道 3.2 中的y,y#​​ 和y*PyArg_ParseTuple() 格式字符,但我仅限于 2.6。

4

1 回答 1

4

好的,我在这个链接的帮助下想出了一个。

我使用了这样的PyByteArrayObject(docs here):

from authbind import authenticate

creds = 'foo\x00bar\x00'
authenticate(bytearray(creds))

然后在扩展代码中:

static PyObject* authenticate(PyObject *self, PyObject *args) {

    PyByteArrayObject *creds;

    if (!PyArg_ParseTuple(args, "O", &creds))
        return NULL;

    char* credsCopy;
    credsCopy = PyByteArray_AsString((PyObject*) creds);
}

credsCopy现在完全按照需要保存字节串。

于 2012-12-18T15:56:38.970 回答