In Python 2.7, strings are byte-strings by default. In Python 3.x, they are unicode by default. Try explicitly making your string a byte string using .encode('ascii')
before handing it to DLL.prepare
.
==>在Python 2.7中,string默认的是byte-strings,而在 Python 3.x中默认的是unicode。因此在3.x中将string传入到调用的DLL之前先使用 .encode('ascii')
将其变成 byte string类型
以下两种方法都能实现 unicode == > byte-strings
>>> a = "hhk"
>>> b = bytes(str(a),'ascii')
>>> b
b'hhk'
>>> c = str(a).encode('ascii')
>>> c
b'hhk'
print(type(a) , type(b) , type(c))
<class 'str'> <class 'bytes'> <class 'bytes'>
可阅读的参考文章 :
“Python3中byte与string的相互转换” : http://www.cnblogs.com/txw1958/archive/2012/08/31/python3-bytes-string.html
1.
c_int()含有属性value,取其value变为python的int类型数据
>>> from ctypes import *
>>> a = c_int(10)
>>> type(a)
<class 'ctypes.c_long'>
>>> b = a.value
>>> b
10
>>> type(b)
<class 'int'>
2.
Python代码中进行比较时,比较的参数一定要全部都是python数据类型,ctypes的数据类型是不能比较的
(python的int类型与ctypes中的c_int类型比较的bool值是False,ctypes中的c_int类型与c_int类型比较的bool值是False)
>>> c = 5
>>> d = c_int(5)
>>> c == d
False
>>> e = d.value
>>> c == e
True
>>> a = c_int(5)
>>> b = c_int(5)
>>> a == b
False
(ctypes中的c_char_p类型与c_char_p类型比较的bool值是False)
>>> a = c_char_p(b"aaa")
>>> b = c_char_p(b"aaa")
>>> a == b
False
>>> a.value == b.value
True
>>> bool(a)
True
>>> a = c_char_p()
>>> bool(a)
False
3.
c_char_p()含有属性value,取其value变为bytes object,再取其decode()属性变为python的str类型数据,python的str类型有encode属性,通过encode属性,变成bytes object类型
>>> a="hhk"
>>> type(a)
<class 'str'>
>>> b=c_char_p(b"hhk")
>>> type(b) b有value属性
<class 'ctypes.c_char_p'>
>>> c=b.value
>>> c bytes object类型,有decode属性
b'hhk'
>>> type(c)
<class 'bytes'>
>>> d=b.value.decode() 通过decode属性,变成python的str类型
>>> d
'hhk'
>>> type(d)
<class 'str'>
>>> b = "hhk" b有encode属性
>>> c = b.encode() 通过encode属性,变成bytes object类型
>>> c
b'hhk'
>>> type(c)
<class 'bytes'>
4.
数字类型的比较:
>>> c = 5
>>> d = c_int(5)
>>> c == d
False
>>> e = d.value
>>> c == e
True
字符串类型的比较:
>>> str1 = "hhk"
>>> str2 = "hhk"
>>> str1 == str2
True
5.
判断c_char_p类型字符串是否为空,使用 if(a)
>>> a = c_char_p()
>>> bool(a)
False
>>> a = c_char_p(b"hhk")
>>> bool(a)
True
判断string类型字符串是否为空,使用 if(a)
>>> a=""
>>> bool(a==None)
False
>>> bool(a)
False
判断列表是否为空,使用 if(list)
>>> list = []
>>> bool(list)
False
>>> not list OK
True
>>> list == None ERROR
False
判断bool值的真假
--ctypes中的任何类型都不能和python中的类型直接比较
>>> a = c_bool(0)
>>> a
c_bool(False)
>>> type(a)
<class 'ctypes.c_bool'>
>>> a==0
False
>>> a==False
False
>>> a.value == 0
True
>>> b = a.value
>>> type(b)
<class 'bool'>
>>> b
False
>>> b == 0
True
6.
判断定义的一个实体对象是否为空
rt = hostid_t()
bool(rt) ==>False
bool(rt == None) ==>False
bool(rt.platform) ==>False
我采用的方法是判断实体对象元素是否为空
if rt.platform == None
if rt.platform
7.
Calling the pointer type without an argument creates a NULL pointer. NULL pointers have a False boolean value
== > 当调用POINTER类型没有传入参数时,将创建一个空指针,空指针将会有一个错误的boolean值
>>> null_ptr = POINTER(c_int)()
>>> print (bool(null_ptr))
False
>>> c_int_p = POINTER(c_int)
>>> null_ptr = c_int_p()
>>> print(bool(null_ptr))
False
//Python 官网实例:
>>> PI = POINTER(c_int)
>>> PI
<class 'ctypes.LP_c_long'>
>>> PI(42)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: expected c_long instead of int
>>> PI(c_int(42))
<ctypes.LP_c_long object at 0x...>