2

我正在使用python bindingsswig. 我想将任意 python 字符串传递给 C-Library。此字符串包含不可打印的字符,例如:

\xff\x0A\82

C-Library 使用 anchar来处理这些数据。为了进行转换,我使用以下 swig 类型图:

%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);
}

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

有没有人建议为0x000xFF完成这项工作?

4

1 回答 1

2

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

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

%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

于 2013-06-01T01:46:55.460 回答