SWIG:传递二进制数据失败

时间:2013-05-31 15:26:42

标签: python c python-3.x swig cpython

我正在使用由python bindings生成的swig的C库。我想将任意python字符串传递给C-Library。该字符串包含不可打印的字符,例如:

\xff\x0A\82

C-Library使用char来处理这些数据。 为了转换我使用以下swig typemap:

%typemap(in) (char *data, int size)
{
        if(!PyUnicode_Check($input))
        {
                PyErr_SetString(PyExc_ValueError, "String value required");
                return NULL;
        }

        $1 = PyBytes_AsString(PyUnicode_AsUTF8String($input));
        $2 = PyUnicode_GetSize($input);
}

这部分有效。只有 0x00 0x7F 之间的值有效。值 0xFF 会转换为错误的值,即 0xC3

是否有人建议 0x00 0xFF

1 个答案:

答案 0 :(得分:2)

Unicode字符串'\xff'完全按照您的编码转换为UTF-8字节序列b'\xc3\xbf'

如果要发送字节数据,请使用字节字符串(b'\xff\x0a\x82')并使用PyBytes方法将其转换为char*和大小:

%typemap(in) (char* data,int size) (Py_ssize_t len) %{
    if(PyBytes_AsStringAndSize($input,&$1,&len) == -1)
        return NULL;
    $2 = (int)len;
%}

请注意,这应该适用于32位和64位Windows,并且空字节可以包含在数据中,因为显式提取了大小并且它处理了64位Py_ssize_t的可能性。