问题描述
我想用perl修补二进制文件。该命令今天不起作用,但是过去我经常使用它。
以下命令在Mac Os X上不起作用:
perl -pi -e 's|\xA0\x37\x96\x30\xDE\x90|\xA7\x70\x92\x30\xD5\x9B|' /file.bin
如果我使用
perl -MO=Deparse -pi -e 's|\xA0\x37\x96\x30\xDE\x90|\xA7\x70\x92\x30\xD5\x9B|' /file.bin
结果是:
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
s/\xA0\x37\x96\x30\xDE\x90/\247p\2220\325\233/;
}
continue {
die "-p destination: $!\n" unless print $_;
}
-e Syntax OK
为什么替换部分被这样修改?
我检查了1000次语法是否正确;为什么它不能按预期工作?
解决方法
它没有被修改。
"\xA7\x70\x92\x30\xD5\x9B"
和
"\247p\2220\325\233"
等效。
$ perl -e'CORE::say "\xA7\x70\x92\x30\xD5\x9B" eq "\247p\2220\325\233" ? "same" : "diff"'
same
- 247 8 = A7 16
-
p
的ASCII编码为70 16 - 222 8 = 92 16
-
0
的ASCII编码为30 16 - 325 8 = D5 16
- 233 8 = 9B 16