问题描述
我在这里真的很困惑,我什至无法更清楚地说明问题的主题。在处理纯文本文件时,我遇到了奇怪的符号(字节)替换。
例如,我有一个包含大约 20000 个字符串的文件,其中之一是:
MIEPTLIRVGEAFYDITHLAPTRHTVPVLVRGNFAKVPVRISYTNHCYSRTPRAGEQVPTGHEIKDGAKLRMFCEQRHRLSSYLPQILIDLLQGETSLWQAAGGNFLQVELVDDVDGEPPTKIEYNVILRMERLKPEGDQKHIMIRVETAYPEDIEYKKGDKPFRKKSKPRAKRIAKY
我将大约 1000 个这样的文件合并在一起,只是用 Python 一个接一个地编写它们(使用简单的 open(filename) 方法)。在我看到的相应字符串中的结果文件中(而所有其他字符串都很好):
MIEPTLIRVGEAFYDITHLAPTRHTVPVLVRGNFAKVPVRISYTNHCYSRTPRAGEQVPTGHEIKDGAKLRMFCEQRHRLSSYLPQILIDLLQGETSLWQAAGGNFLQVELVDDVDGEPPTKIEYNVILRMERLKPEGDQKHIMIRVETAYPEDIEYKGDKPFRKKSDRKPEKREK
因此,发生了将“Y”(HEX 59)替换为“Щ”字母(HEX D9)的情况(两个字母都在上面加粗)。如果我再次执行此过程,则此位置不会发生替换,因此它是随机的(?)。我还注意到在其他情况下“P”(HEX 50)和俄语“Р”字母(HEX D0)发生了同样的替换。将这些情况统一起来的是,如果我们从 ASCII 表的 0 和 128 位置开始计数,则在这两种情况下,一对中的字母具有相同的数字:英语 P 的位置为 80,而俄语 Р 的位置为 128+80=208;字母 Y 的位置为 89,字母“Щ”的位置为 128+89=217。我想这是一种文件损坏,但它是如何发生的,为什么会发生?有什么想法吗?
解决方法
我应该在问之前就猜到了:实际上它看起来像一个位翻转,它可能会随机发生,作为读/写磁盘的错误。如果编码字母的字节中的第一个位翻转,则替换变得可见,因为该字母不再位于 ASCII 表的前 128 个符号中,并且某些软件会对此变得胡思乱想。
"Y" = 01011001
"Щ" = 11011001
"P" = 01010000
"Р" = 11010000