所以我有一个python脚本,它使用pyserial库通过串口将文件发送到另一台计算机.我写了一些脚本来计算文件的md5校验和,通过串口发送之前和之后我遇到了一些问题.
示例:我发送了一个名为third.txt的简单文件,其中包含数字1到10的列表.简单文件,没有任何花哨或大.发送前文件的校验和与在另一台计算机上发送后的文件校验和完全不同,即使文件明显相同.
我通过简单地通过USB移动文件并以这种方式进行校验和计算来检查我的代码是否有问题.这次它奏效了.
任何想法为什么会发生这种情况以及如何解决这个问题?
这是发送前的校验和代码.这不是确切的代码,但基本上就是我所做的.
<>
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<>\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()
Martijn Piet.. 6
是的,以文本模式打开文件可能会导致读取不同的数据,因为换行符将从平台本机格式转换为\n
.因此,\r\n
在Windows和POSIX平台上读取时,包含的文件将为您提供不同的校验和.
改为以二进制模式打开文件:
with open(file_loc, 'rb') as file_to_read:
请注意,写入文件时也是如此.如果您使用\n
行结尾从POSIX系统接收数据,并将其写入打开以便在Windows上以文本模式\r\n
写入的文件,则最终会在写入的文件中添加行结尾.
如果您使用的是Python 3,则会使问题复杂化.在文本模式下打开文件时,您将数据从已编码的字节转换为已解码的Unicode值.使用什么编解码器也可能因OS而异,甚至从机器到机器也不同.默认值是locale-defined(using locale.getpreferredencoding(False)
),只要数据可以通过默认语言环境解码,您就可以使用不同的编解码器读取文件得到非常不同的结果.您确实希望通过明确设置它来确保使用相同的编解码器,或者更好的是,以二进制模式打开文件.
因为hashlib
要求你提供字节字符串,这在尝试计算摘要时不是问题(你已经遇到了这个问题,至少不得不考虑那里的编解码器),但这也适用于文件传输; 写入文本文件会将数据编码为默认编解码器.
是的,以文本模式打开文件可能会导致读取不同的数据,因为换行符将从平台本机格式转换为\n
.因此,\r\n
在Windows和POSIX平台上读取时,包含的文件将为您提供不同的校验和.
改为以二进制模式打开文件:
with open(file_loc, 'rb') as file_to_read:
请注意,写入文件时也是如此.如果您使用\n
行结尾从POSIX系统接收数据,并将其写入打开以便在Windows上以文本模式\r\n
写入的文件,则最终会在写入的文件中添加行结尾.
如果您使用的是Python 3,则会使问题复杂化.在文本模式下打开文件时,您将数据从已编码的字节转换为已解码的Unicode值.使用什么编解码器也可能因OS而异,甚至从机器到机器也不同.默认值是locale-defined(using locale.getpreferredencoding(False)
),只要数据可以通过默认语言环境解码,您就可以使用不同的编解码器读取文件得到非常不同的结果.您确实希望通过明确设置它来确保使用相同的编解码器,或者更好的是,以二进制模式打开文件.
因为hashlib
要求你提供字节字符串,这在尝试计算摘要时不是问题(你已经遇到了这个问题,至少不得不考虑那里的编解码器),但这也适用于文件传输; 写入文本文件会将数据编码为默认编解码器.