每当程序打开文件时,它都会将该文件视为二进制数据。它将其转换为更高级的解释语言,即八进制、十六进制、ascii 等。在这种情况下,它在左侧 Pane 中显示十六进制,在右侧 Pane 中显示 ansi(Windows 7,因此应该是 CP1252)。下面的三张图片展示了原始 View ,然后是所需的更改,第三张是代码所做的实际更改:
with open(tar,'rb') as f:
data = binascii.hexlify(f.read(160))
if old in data:
print 'found!'
data = data.replace(old, new)
else:
print 'not found'
with open(tar+'new', 'wb') as fo:
binascii.unhexlify(data)
fo.write(data)
我显然没有正确定位写入传递方法。
最佳答案
提示:这两行有什么区别:
data = binascii.hexlify(f.read(160))
binascii.unhexlify(data)
在Python中,字符串对象是不可变的。您无法调用 data
来导致 data
命名的字符串发生更改,因为字符串不会更改。 binascii.unhexlify
相反返回一个new 字符串 - 这就是为什么第一个语句甚至首先起作用。如果您想.write
生成的新字符串,那么您应该指定在代码中发生的事情 - 直接:
fo.write(binascii.unhexlify(data))
或者首先将其分配回data
。
关于python unhexlify 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21522332/