所以我有一个python脚本,它使用pyserial库将文件通过串行发送到另一台计算机。我写了一些脚本来计算文件在串行发送前后的md5校验和,我遇到了一些问题。在
示例: 我发送了一个简单的文件名为第三.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')
这是我发送后的校验码。在
^{pr2}$
是的,在文本模式下打开一个文件可能会导致不同的数据被读取,因为换行符被转换为
\n
。因此,在Windows和POSIX平台上读取时,包含\r\n
的文件将提供不同的校验和。在以二进制模式打开文件:
注意,当写入文件时,同样适用。如果使用
\n
行结尾从POSIX系统接收数据,并将其写入在Windows上以文本模式打开的文件中,则在写入的文件中会出现\r\n
行结尾。在如果您使用的是python3,则会使问题更加复杂。在文本模式下打开文件时,将数据从编码字节转换为解码的Unicode值。不同的操作系统,甚至不同的机器,所使用的编解码器也会有所不同。默认值是locale defined(使用
locale.getpreferredencoding(False)
),只要数据可以按照默认的语言环境进行解码,就可以从使用不同的编解码器读取文件得到非常不同的结果。你真的想通过显式地设置它来确保使用相同的编解码器,或者更好的是,以二进制模式打开文件。在由于
hashlib
需要向它提供字节字符串,所以在尝试计算摘要时,这并不是一个问题(您可能会遇到这个问题,并且至少要考虑那里的编解码器),但这也适用于文件传输;将写入文本文件会将数据编码到默认的编解码器。在相关问题 更多 >
编程相关推荐