为什么在使用纯文本文件进行操作时会发生单字节损坏?

Why a single byte corruption while manipulating with plain text files could happen?

我真的很困惑,连题目都说不清楚。在处理纯文本文件时,我遇到了奇怪的符号(字节)替换。

例如,我有一个包含大约 20000 个字符串的文件,其中一个是: MIEPTLIRVGEAFYDITHLAPTRHTVPVLVRGNFAKVPVRISYTNHCYSRTPRAGEQVPTGHEIKDGAKLRMFCEQRHRLSSYLPQILIDLLQGETSLWQAAGGNFLQVELVDDVDGEPPTKIEYNVILRMERLKPEGDQKHIMIRVETAYPEDIEYDKPFRKKSYKVSRILAAKKKKG0KVSRILAAKKKKG0[=]

我将大约 1000 个这样的文件合并在一起,只是用 Python 一个接一个地写入它们(使用简单的 open(filename) 方法)。在我看到的相应字符串的结果文件中(而所有其他字符串都很好): MIEPTLIRVGEAFYDITHLAPTRHTVPVLVRGNFAKVPVRISYTNHCYSRTPRAGEQVPTGHEIKDGAKLRMFCEQRHRLSSYLPQILIDLLQGETSLWQAAGGNFLQVELVDDVDGEPPTKIEYNVILRMERLKPEGDQKHIMIRVETAYPEDIEYDKPFRKKSKAKVSRILAAKKWEDKVSRILAAKKWED

因此,将“Y”(十六进制 59)替换为“Щ”字母(十六进制 D9)(两个字母都在上面加粗)。如果我再次执行此过程,则此位置不会发生替换,因此它是随机的(?)。我还注意到在其他情况下,“P”(HEX 50)和俄语“Р”字母(HEX D0)发生了相同类型的替换。将这些情况统一起来的是,如果我们从 ASCII table 的 0 和 128 位置开始计算,在这两种情况下,一对中的字母具有相同的编号:英语 P 的位置为 80,俄语 Р 的位置为 128+80=208 ;字母 Y 的位置为 89,字母“Щ”的位置为 128+89=217。我想这是一种文件损坏,但它是如何发生的,为什么会发生呢?有什么想法吗?

我自己应该在问之前就猜到了:实际上它看起来像一个位翻转,可能随机发生 reading/writing 到磁盘的错误。如果编码字母的字节中的第一位发生翻转,替换就会变得可见,因为该字母不再出现在 ASCII 的前 128 个符号中 table 并且某些软件对此变得胡思乱想。

"Y" = 01011001
"Щ" = 11011001 

"P" = 01010000 
"Р" = 11010000