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...>

Python ctypes 在 Python 2 和 Python 3 中的不同 // 使用ctypes过程中问题汇总的更多相关文章

  1. python安装过程中的一些问题

    因为看到大神的教程是基于python V2.7,下载该版本且安装成功. 安装目录: https://www.python.org/download/releases/2.7/ 根据系统进行安装包下载 ...

  2. python学习笔记:安装boost python库以及使用boost.python库封装

    学习是一个累积的过程.在这个过程中,我们不仅要学习新的知识,还需要将以前学到的知识进行回顾总结. 前面讲述了Python使用ctypes直接调用动态库和使用Python的C语言API封装C函数, C+ ...

  3. python的库有多少个?python有多少个模块?

    这里列举了大概500个左右的库: !   Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主 ...

  4. python 学习第五天,python模块

    一,Python的模块导入 1,在写python的模块导入之前,先来讲一些Python中的概念性的问题 (1)模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质是.py ...

  5. 进击的Python【第二章】:Python基础(二)

    Python基础(二) 本章内容 数据类型 数据运算 列表与元组的基本操作 字典的基本操作 字符编码与转码 模块初探 练习:购物车程序 一.数据类型 Python有五个标准的数据类型: Numbers ...

  6. Python黑帽编程1.3 Python运行时与包管理工具

    Python黑帽编程1.3  Python运行时与包管理工具 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and ...

  7. Python黑帽编程2.1 Python编程哲学

    Python黑帽编程2.1  Python编程哲学 本节的内容有些趣味性,涉及到很多人为什么会选择Python,为什么会喜欢这门语言.我带大家膜拜下Python作者的Python之禅,然后再来了解下P ...

  8. 进击的Python【第一章】:Python背景初探与Python基础(一)

    Python背景初探 一.Python起源 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做 ...

  9. [Python学习] Linux环境下的Python配置,必备库的安装配置

    1.默认Python安装情况 一般情况,Linux会预装Python的,版本较低,比如Ubuntu15的系统一般预装的是Python2.7.10. 使用命令:which python可以查看当前的py ...

随机推荐

  1. 【TCP】- TCP协议简介

    转载:https://blog.csdn.net/ningdaxing1994/article/details/73076795 TCP 是互联网核心协议之一,本文介绍它的基础知识. 一.TCP 协议 ...

  2. Jmeter系列-自动生成html报告

    从JMeter 3.0开始已支持自动生成动态报告,我们可以更容易根据生成的报告来完成我们的性能测试报告. 如何生成html测试报告 如果未生成结果文件(.jtl),可运行如下命令生成报告: jmete ...

  3. Perfmon - Windows 自带系统监控工具

    一. 简述 可以用于监视CPU使用率.内存使用率.硬盘读写速度.网络速度等. Perfmon提供了图表化的系统性能实时监视器.性能日志和警报管理,系统的性能日志可定义为二进制文件.文本文件.SQLSE ...

  4. Windows2008安装启用无线网卡

    昨天给本子换了系统来着,本来想法是好的,想在本子上安装Hyper-v来搭建多平台VPS,这样的话就能玩多个系统了,对于我自己来说对娱乐没啥兴趣,扯多了,正文 笔记本安装什么都很顺利,但是无线网卡把我难 ...

  5. MySQL优化之profile

    分析SQL执行带来的开销是优化SQL的重要手段.在MySQL数据库中,可以通过配置profiling参数来启用SQL剖析.该参数可以在全局和session级别来设置.对于全局级别则作用于整个MySQL ...

  6. Python使用又拍云进行第三方文件拉取

    在爬虫过程中,需要将图片或其他文件进行存储到云上,但在下载图片时,看官方文档,貌似需要先下载到后再上传又拍云,感觉效率很低下.经查找资料实现Python直接对第三方资源进行文件拉取操作,即不需要下载到 ...

  7. RT-thread内核之事件

    一.事件控制块:在include/rtdef.h中 #ifdef RT_USING_EVENT /** * flag defintions in event */ #define RT_EVENT_F ...

  8. linux文件服务器:samba服务器

    windows上,需要和linux虚拟机进行方便的文件交互,总结一下遇到的问题. 1.samba简介 windows和windows之间共享文件可以用“网上邻居”,linux和linux间共享文件用 ...

  9. zlog使用手册

    zlog使用手册 来源 http://hardysimpson.github.io/zlog/UsersGuide-CN.html Contents Chapter 1  zlog是什么? 1.1   ...

  10. 2017中国大学生程序设计竞赛-哈尔滨站 H - A Simple Stone Game

    A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...