【问题标题】:python swig string to char* conversionpython swig 字符串到 char* 的转换
【发布时间】:2015-09-02 21:02:15
【问题描述】:

我正在处理一个使用 python SWIG 模块的项目。该模块有一个功能:

void func(char* pin, unsigned long len);

并像这样从 python 调用:

key = "\x42\x1d\xd7"
modul.func(key)

奇怪的是传入数组的大小是4而不是3。最后一个字符(d7)被转换成两个字符(c3 97)。我注意到如果该字节设置了最高位,那么它会扩展为两个字节。我想这与字符串编码等有关。

还有另一种将“\x42\x1d\xd7”传递给 SWIG 模块函数的方法吗?

换句话说:我需要一种在 python 中创建字符串的方法,这有点畸形。它只需要 3 个字节 [0x42, 0x1d, 0xd7]

【问题讨论】:

    标签: python c string swig


    【解决方案1】:

    你的意思是说你想通过\x42\x1d\xd7而不把它转换成unicode?​​p>

    您遇到的问题是因为\x42\x1d\xd7 在传递给modul.func() 时被转换为'utf-8'。

    您可以通过以下方式进行测试 -

    key = "\x42\x1d\xd7"
    key.encode('utf-8').decode('unicode-escape')
    >> 'B\x1d\xc3\x97'
    

    对于您的问题,您可以停止 python 对 key 变量的编码/解码,方法是将 r 附加到字符串的定义中,如下所示 -

    key = r"\x42\x1d\xd7"
    

    这告诉 python 解释器读取字符串 raw 。试试看。

    【讨论】:

    • 如果我使用raw,传入数组的大小是12,它带有斜杠和'x'-es。我想获取大小为 3 的传入数组。{0x42, 0x1d, 0xd7}
    • 我也尝试传递 key.encode(),但随后 python 抱怨类型 TypeError: in method 'Module_func', argument 2 of type 'char *'
    • 试试 - key.encode('utf-8').decode() ,没有 raw
    • key.encode('unicode-escape').decode() 没有原始变成 "B\\x1d\\xd7\\x92q" char* 字符串
    • 这不起作用,会产生更多不同的字节。我想要的是在python中创建一个字符串对象并将这个字符串传递给C,但是这个字符串必须有3个字节(0x42、0x1d、0xd7)
    猜你喜欢
    • 2015-03-11
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多