【问题标题】:Convert '\x00' to ASCII in Python 3在 Python 3 中将 '\x00' 转换为 ASCII
【发布时间】:2016-03-10 00:54:36
【问题描述】:

我目前有以下操作:

a = 'cat\x00  '

格式为 unicode(默认 Python 3 字符串格式)。我希望将其转换为 ASCII。到目前为止,我已经尝试过:

a = bytes(a, 'ascii')
print(a)

OUT: b'cat\x00   '

使用 byes 命令将 'a' 转换为原始字符串,而不执行 '\x' 转义字符。执行十六进制转换后,有没有办法可以将“a”转换为 ASCII?

我需要 ctypes 的 'a' 值:

ct.c_char_p(a)

【问题讨论】:

  • 您希望看到什么? NUL 是不可打印的字符。
  • 我希望将 b'cat\x00 ' 作为 ASCII 发送到 ctypes。 ctypes 只能处理 ASCII 代码,但 Python 3 可以在 unicode 中执行字符串操作。因此,我不知道如何有效地将其转换为 ASCII 以供 ctypes 使用。当使用 ctypes 发送到 C 库时,所有像 'a' 这样的字符串将具有相同的长度。字符串末尾的 0x00 基本上会告诉 C 代码忽略该值之后的任何内容。
  • ctypes 不限于 ASCII。 c_char_p 是指向任何以 null 结尾的字节字符串的指针。这可以是任何没有嵌入空值的单字节或多字节字符编码,例如 ASCII、Latin-1、Windows 代码页或 UTF-8。对于宽字符串(UTF-16 或 UTF-32),请使用 c_wchar_p。请使用您尝试调用的 C 函数原型更新您的问题。
  • 我目前无法访问 C 代码。我确实有 Python 2 中的 ctypes 代码,并且有效。我只是想将代码转换为 Python 3。Python 2 代码基本上将 'cat\x00' 作为 c_char_p 的变量。
  • 小修正。我正在使用 C++ 代码。不是 C 代码。我正在使用 c_types 从 DLL 文件中读取函数。

标签: python string python-3.x hex ctypes


【解决方案1】:

只需传递b'cat''cat'.encode()。两者都会将一个以 null 结尾的字节字符串传递给 c_char_p ctypes 参数。您不需要自己添加 null。

some.dll 中调用void func(const char* s) 的示例:

from ctypes import *
dll = CDLL('some.dll')
dll.func.argtypes = [c_char_p]
dll.func.restype = None

dll.func(b'cat')
dll.func('cat'.encode())

【讨论】:

    【解决方案2】:
    ct.c_char_p(a.encode('UTF-8'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 2019-02-08
      • 1970-01-01
      • 2016-12-24
      • 2013-05-17
      • 1970-01-01
      • 2019-06-04
      相关资源
      最近更新 更多