You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:15:31