0

所以我有一个 python 脚本,它使用 pyserial 库将文件通过串行发送到另一台计算机。我写了一些脚本来计算文件在通过串行发送之前和之后的 md5 校验和,我遇到了一些问题。

示例:我发送了一个名为 third.txt 的简单文件,其中包含从 1 到 10 的数字列表。简单文件,没有什么花哨或大的。传输前的文件校验和与传输到另一台计算机后的文件校验和完全不同,即使文件明显相同。

我通过简单地通过 USB 移动文件并以这种方式进行校验和计算来检查我的代码是否有问题。这次奏效了。

任何想法为什么会发生这种情况以及我可能如何解决它?

这是我发送前的校验和代码。这不是确切的代码,但基本上是我所做的。

<<Code that waits for command from client>>

with open(file_loc) as file_to_read:
    data = file_to_read.read()
    md5a = hashlib.md5(data).hexdigest()
ser.write('\n' + md5a + '\n') 

这是我发送后的校验和代码。

with open(file_loc) as file_to_read:
    data = file_to_read.read()
    md5b = hashlib.md5(data).hexdigest()
print('Sending Checksum Command')
ser.write("\n<<SENDCHECKSUM>>\n")

md5a = ser.readline()
print(md5a)
print(md5b)
if md5a == md5b:
    print("Correct File Transmission")
else:
    print("The checksum indicated incorrect file transmission, please check.")
ser.flush()
4

1 回答 1

6

是的,以文本模式打开文件可能会导致读取不同的数据,因为换行符会为您从平台本机格式转换为\n. \r\n因此,当在 Windows 和 POSIX 平台上读取时,包含的文件将为您提供不同的校验和。

改为以二进制模式打开文件:

with open(file_loc, 'rb') as file_to_read:

请注意,写入文件时也是如此。如果您使用\n行尾从 POSIX 系统接收数据,并将其写入为在 Windows 上以文本模式写入而打开的文件,您将\r\n在写入的文件中以行尾结束。

如果您使用的是 Python 3,那么事情就会变得更加复杂。当您以文本模式打开文件时,您正在将数据从编码字节转换为解码的 Unicode 值。使用什么编解码器也可能因操作系统而异,甚至因机器而异。默认是语言环境定义的(使用locale.getpreferredencoding(False)),只要数据可以通过默认语言环境解码,您就可以通过使用不同的编解码器读取文件获得非常不同的结果。您确实希望通过明确设置或更好地以二进制模式打开文件来确保使用相同的编解码器。

由于hashlib需要您输入字节字符串,因此在尝试计算摘要时这不是问题(您会遇到该问题并且至少必须考虑那里的编解码器),但这也适用于文件传输;写入文本文件会将数据编码为默认编解码器。

于 2013-12-24T19:29:55.597 回答