Python 2.7.2写入十六进制值异常,求原因解析
问题根源与解决方案
这个问题的核心在于Python 2.7在Windows XP下默认的文件写入模式是文本模式,它会自动对字节序列进行编码转换,而非直接写入原始二进制数据。
具体原因分析
在Python 2.7环境中:
- 你定义的
test1 = "\xdd\xba\x01\x10"和struct.pack生成的test2本质都是字节串(str类型)。 - 当你用默认的
open(filename, "w")打开文件时,Windows会调用系统默认的ANSI编码(通常是cp1252)处理这些字节。\xdd\xba这组字节会被文本模式的编码逻辑错误解析或转换,最终导致原始字节被篡改,出现你看到的\x77a这类异常值。
正确的解决方法
你需要用二进制写入模式打开文件,这样Python会直接写入原始字节,不会进行任何编码转换:
import struct # 用二进制模式打开文件,确保字节原样写入 with open("your_target_file.bin", "wb") as f: test1 = "\xdd\xba\x01\x10" f.write(test1) test2 = struct.pack("<I", 0x1001badd) f.write(test2)
使用"wb"模式(write binary)就能彻底避免字节被篡改的问题,是处理二进制数据的标准做法。
为什么你的临时修复能生效
你添加空格再替换的操作,相当于把\xdd和\xba用空格(\x20)分隔开,避免了它们被文本模式的编码逻辑当成连续的、需要转换的字节序列,从而侥幸绕过了编码转换的问题。但这只是临时的权宜之计,二进制写入才是根本解决办法。
内容的提问来源于stack exchange,提问作者2808




