python - SWIG:传递二进制数据失败

标签 python c python-3.x swig cpython

我正在使用带有由 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);
}

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

有没有人建议让这项工作从0x000xFF

最佳答案

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/

相关文章:

python - 使用Python检测短网址

python - Django-admin.py 在我的共享主机环境中产生错误

python - numpy数组迭代的优化

c - 如何找到从 1 到 n 和从 n+1 到 m 的和相同的数对

python - 为什么变量 = 对象不像变量 = 数字那样工作

python - 是否可以在附魔中传递多个字典?

python - PyQt 打印原始 PDF

c++ - FPGA开发入门

为 AIX 编译 ANTLR 3C

python - 如何在 python 中翻转一个字节?