我正在使用带有由 swig
生成的 python 绑定(bind)
的 C 库。我想将任意 python 字符串传递到 C 库。该字符串包含不可打印的字符,例如:
\xff\x0A\82
C 库使用 char
来处理此数据。
为了进行转换,我使用以下 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);
}
这部分有效。仅0x00 和0x7F 之间的值有效。值 0xFF 被转换为错误值,即 0xC3。
有没有人建议让这项工作从0x00到0xFF?
最佳答案
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
的可能性。
关于python - SWIG:传递二进制数据失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16860792/