【问题标题】:Strings operation issue while switching from python 2.x to python 3从 python 2.x 切换到 python 3 时的字符串操作问题
【发布时间】:2015-11-11 09:48:36
【问题描述】:

字符串从 python 2.x 切换到 python 3 时遇到一些问题

问题 1:

from ctypes import*
charBuffer=create_string_buffer(1000)
var = charBuffer.value  # var contains like this "abc:def:ghi:1234"
a,b,c,d= var.split(':')

它在 python 2.x 中可以正常工作,但在 3.x 中却不行,它会抛出一些像这样的错误 a,b,c,d= var.split(':') TypeError: 'str' 不支持缓冲区接口

我在 stackoverflow link link2 做了一些研究后得到了链接

如果我打印,所需的输出将是

a= abc
b =def
c=ghi 
d=1234

问题2:

from ctypes import*
cdll = "Windll"
var = 0x1fffffffffffffffffffffff # I want to send this long variable to character pointer which is in cdll

charBuf =create_string_buffer(var.to_bytes(32,'little'))
cdll.createBuff (charBuf )

cdll function
int createBuff (char * charBuff){
   print charBuff
   return 0;
}

我想将这个长变量发送到 cdll 中的字符指针,因为它是一个字符指针,它会抛出错误。 需要您对我如何实现这一点的宝贵意见。提前致谢

【问题讨论】:

  • @Vineet Kumar Doshi,在我的问题陈述中添加了所需的输出

标签: python ctype


【解决方案1】:

在 Python 3.x 中,'.value' 在 create_string_buffer() 返回时返回一个字节字符串。

在您的示例中,您尝试使用 Unicode 字符串(这是 Python 3.x 中的普通字符串)拆分字节字符串。这就是导致您的问题的原因。

您需要使用 byte string 进行拆分。示例 -

a,b,c,d = var.split(b':')

或者您可以使用 '.decode()' 方法将字节字符串解码为 Unicode 字符串。

例子-

var = var.decode('<encoding>')

【讨论】:

  • 我不鼓励第二个例子。用字节字符串拆分 unicode 字符串是不对称的。也就是说,它适用于 py2,但不适用于 py3。例如。 u"a b".split(b" ").
  • 非常感谢,辛苦了!!我已经为问题陈述添加了明确的目标,请您检查一下。
  • True ,但我只是给出了 var 或其他变量的选项,之后需要作为普通字符串(而不是字节字符串)。如果只需要发送到c函数,那么第一种是推荐的方法
  • @Anand S Kumar,我在向 cdll 中的字符指针发送 128 尼特长整数时遇到了一些问题,完全卡在这个问题上。你能帮忙吗?
【解决方案2】:

使用b":" 进行拆分,您可以在两个版本的python 中使用。

在py2中str是一个字节串,在py3中str是一个unicode对象。 ctypes 字符串缓冲区返回的对象是一个字节串(py2 上的str 和py3 上的bytes)。通过将字符串文字写为b"...,您可以强制它在两个版本的python 中都是字节字符串。

【讨论】:

  • 太好了!!成功了,我已经为问题陈述添加了明确的目标,请您检查一下。
  • @Dunes in issue2 在将 128 nit Long 整数发送到 cdll 中的字符指针时遇到一些问题,我怎样才能与 python 兼容,你能帮忙吗?
猜你喜欢
  • 1970-01-01
  • 2020-08-31
  • 2013-01-05
  • 2011-11-09
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 2021-07-17
相关资源
最近更新 更多