我正在使用由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 ?
答案 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
的可能性。