python传递字符串到c或c++时,出现格式错误:TypeError: bytes or integer address expected instead of str instance或者出现字符串传递不成功。

1、python有两种不同的字符串,一种存储文本,一种存储字节。对于文本python内部采用unicode存储,而字节字符串显示原始字节序列或者ASCII

2、python3,文本字符串类型(使用unicode数据存储)被命名为str,字节字符串类型命名为bytes。

一般情况下,实例化一个字符串会得到一个str对象,如果想得到bytes,那就在文本之前加上前缀b,或者encode一下。所以,str对象有一个encode方法,bytes对象有一个decode方法

#str和bytes之间的转换:

str->encode()->bytes

bytes->decode()->str

注:windows编码方式默认是gbk和linux默认是utf8

解决方案:

方法一:将传递的字符串后面加上.encode()

如,python下时转换为:"11.jpg".encode()

(pah:0)root@anhui-k55vd:python3
Python 3.6.9 (default, Jan 26 2021, 15:33:00) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> so=ctypes.cdll.LoadLibrary("./libcrachrecg.so")
>>> so.testGetImg(ctypes.c_char_p("./11.jpg"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bytes or integer address expected instead of str instance
>>> so.testGetImg(ctypes.c_char_p("11.jpg"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bytes or integer address expected instead of str instance
>>> so.testGetImg("11.jpg".encode())
0
>>> 

方法二:将传递的字符串前面加上b,表示格式化为字节序,效果与方法一等同

>>> so.testGetImg(b"11.jpg")
0
>>> 

运行正确。

更多内容可参考:python3文本字符串与字节字符串_u012501054的博客-CSDN博客

Logo

更多推荐