Python3在Mac可匹配十六进制串4D4D002A,Ubuntu下失败原因查询
问题原因
你遇到的跨平台差异核心是二进制文件读取时的编解码逻辑依赖系统默认配置,具体触发原因是代码里的两个错误写法:
- 处理图片这类二进制文件时,没有使用
rb(二进制读)模式打开,而是用了默认的文本读模式 - 错误地将读取到的
bytes类型二进制数据强制转成了str类型字符串
Python3的文本模式读取文件时,会自动用当前系统的默认编码把原始字节解码为Unicode字符串,不同系统的默认编码规则不一致:
- MacOS默认的区域编码通常是兼容度更高的UTF-8或Latin-1,你给出的文件头里的目标序列
4D 4D 00 2A刚好能在解码后保留原始对应关系,所以可以正常命中 - Ubuntu系统的默认编码多为严格的UTF-8,你提供的JPG文件头里有大量不符合UTF-8编码规则的字节(比如开头的
FF D8 FF E1等),解码时要么直接抛出异常,要么默认用替换字符�覆盖无效字节,导致原始字节序列被篡改,自然找不到目标串。
修复方案
直接操作原始二进制字节流,不要做不必要的str类型转换,修改后代码如下:
# 打开文件时必须指定rb二进制模式 fn = open("目标文件路径", "rb") fn.seek(0, 0) first_34_byte = fn.read(34) # 所有查找操作都针对bytes类型,用b前缀声明字节串 if first_34_byte.upper().find(b'EXIF') >= 0: print('EXIF Found') tiff_hdr = first_34_byte.find(b'\x4D\x4D\x00\x2A') print(' tiff_hdr=', tiff_hdr)
修改后的代码完全绕过了系统编码的影响,跨平台运行结果完全一致。
内容的提问来源于stack exchange,提问作者ToniE
相关产品推荐
相关产品推荐

