Python 2转Python 3:如何让ctypes.create_string_buffer输出一致?
解决Python 3中ctypes.create_string_buffer输出兼容Python 2的问题
在Python 3中,ctypes.create_string_buffer返回的对象,其raw属性是bytes类型,打印时会默认显示带b标识的可读格式(比如b'\x00\x01'),这和Python 2中直接输出字节序列的行为不同。要实现类似Python 2的输出效果,可以用以下两种方法:
方法1:直接输出原始字节流
利用sys.stdout.buffer直接写入字节,绕过Python 3对字节串的可读格式化,直接输出原始字节:
import ctypes import sys # 创建示例buffer sb = ctypes.create_string_buffer(b'\x00\x01\x7f\xff\x41') # 直接输出原始字节 sys.stdout.buffer.write(sb.raw) sys.stdout.buffer.write(b'\n') # 添加换行
这种方式会和Python 2中直接打印str类型的buffer内容完全一致,非ASCII字节会直接输出对应的原始字符(可能显示为乱码,取决于终端编码)。
方法2:将字节映射为单字节编码的字符串
使用latin-1编码解码字节串,因为latin-1是单字节一对一映射的编码,每个字节都会对应一个Unicode字符,解码后的字符串打印效果和Python 2中打印str一致:
import ctypes sb = ctypes.create_string_buffer(b'\x00\x01\x7f\xff\x41') # 解码为latin-1字符串 print(sb.raw.decode('latin-1'))
差异原因
Python 2中的str本质是字节序列,打印时直接输出字节对应的字符;而Python 3中bytes是独立的字节类型,默认打印会采用可读格式化(显示b标识和转义序列),上述方法就是为了绕过这种格式化,还原Python 2的原始字节输出行为。
内容的提问来源于stack exchange,提问作者chewing gum
相关产品推荐
相关产品推荐

