Python中如何将字符串转为二进制对象解决MMS PDU解码报错问题
解决方案
你遇到的问题本质是二进制字节流和字符串类型混用导致的编码解码错误,按照以下步骤修改即可跳过临时文件方案:
- 先保证你读取的原始响应是二进制格式,按字节分割HTTP头和PDU内容,不要使用字符串形式的分隔符:
data = buf.getvalue() # 用字节类型的分隔符分割,避免默认编码转换报错 header_part, pdu_part = data.split(b"\r\n\r\n", 1)
- 直接构造和
from_file方法输入格式一致的二进制数组传入from_data即可:
import array # 构造类型为B(无符号字节)的数组,和源码读取文件的逻辑完全一致 pdu_bin = array.array('B', pdu_part.strip()) mms = MMSMessage.from_data(pdu_bin)
错误原因说明
- 你之前使用字符串形式的
"\r\n\r\n"分割响应,如果原始data是字节流,Python会默认尝试用ASCII编码将字节流转为字符串再分割,遇到大于127的二进制字节就会抛出解码错误。 - 你写入文件再读取的逻辑之所以能走通,是因为写文件时Python自动完成了字符串到字节的转换,读文件时直接拿到了正确的二进制数据,绕开了直接传参时的类型不匹配问题。
- 你尝试用
bytearray转换时指定UTF-8编码依然报错,是因为传入的字符串已经是被错误解码后的结果,转换前Python会先尝试用ASCII编码还原这个字符串到原始字节,才会出现你看到的ASCII解码报错。
内容的提问来源于stack exchange,提问作者Iain Dooley
相关产品推荐
相关产品推荐

