为什么在处理纯文本文件时会发生单个字节损坏?

问题描述

我在这里真的很困惑,我什至无法更清楚地说明问题的主题。在处理纯文本文件时,我遇到了奇怪的符号(字节)替换。

例如,我有一个包含大约 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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...