python swig string to char * conversion

时间:2015-06-17 14:37:37

标签: python c string swig

我正在使用一个使用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]

1 个答案:

答案 0 :(得分:0)

你的意思是说你希望在没有被转换为unicode的情况下传递\x42\x1d\xd7吗?

您的案例中的问题是因为\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。试试吧。