Python中如何在rb模式下仅读取字节而非字符?
解决二进制文件读取时字节被解析为字符的问题
问题出在你把读取到的二进制bytes对象直接转成了字符串:str(f.read(byteAdressEnd))。Python的str()会自动把字节中可打印的ASCII字符(比如0x76对应'v'、0x75对应'u')直接显示为字符,而不是保留\xXX的十六进制字节格式,这就造成了你看到的“字节被合并、替换成字符”的假象。
正确的处理方式
保留原始二进制数据
读取文件后直接用bytes类型存储,不要转成字符串:f = open('tree.sgi', 'rb') byteAdressEnd = 24 byte_data = f.read(byteAdressEnd)此时
byte_data是纯粹的二进制字节序列,完全保留文件中的原始字节信息。格式化查看十六进制字节(如果需要)
如果要查看字节的十六进制表示,避免字符解析干扰,可以用以下两种方式:- 方式一:遍历字节格式化输出
# 输出每个字节的两位十六进制格式,用空格分隔 formatted_output = ' '.join(f'{byte:02x}' for byte in byte_data) print(formatted_output) - 方式二:用
binascii工具转换import binascii # 转成十六进制字符串后解码为ASCII,再按字节分隔 hex_str = binascii.hexlify(byte_data).decode('ascii') formatted_output = ' '.join(hex_str[i:i+2] for i in range(0, len(hex_str), 2)) print(formatted_output)
这两种方式都会输出类似
01 da 01 01 00 03 04 b0 02 76 00 03...的格式,完全还原每个字节的真实值。- 方式一:遍历字节格式化输出
原代码的问题本质
str(f.read(...))会把bytes对象转换成它的字符串表示形式(比如b'\x01\xda\x02v\x00'),其中可打印字符会直接显示为字符,而非转义的十六进制格式,这就是你看到“字节被当作字符读取”的原因。
内容的提问来源于stack exchange,提问作者mjkh10
相关产品推荐
相关产品推荐

