0

そのため、pyserial ライブラリを使用してファイルをシリアル経由で別のコンピューターに送信する python スクリプトがあります。シリアル経由で送信される前後のファイルの md5 チェックサムを計算するスクリプトを書きましたが、いくつかの問題が発生しました。

例: 1 から 10 までの数字のリストを含む third.txt という名前の単純なファイルを送信しました。ファイルが明らかに同じであっても、送信前のファイルのチェックサムは、他のコンピューターで送信した後のファイルのチェックサムとはまったく異なります。

ファイルを 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\nWindows と POSIX プラットフォームで読み取ると、ファイルに含まれるチェックサムが異なります。

代わりにバイナリ モードでファイルを開きます。

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

ファイルを書き込む場合も同様です。\n行末を使用して POSIX システムからデータを受信し、これを Windows のテキスト モードで書き込み用に開いたファイルに書き込む\r\nと、書き込まれたファイルには行末が含まれます。

Python 3 を使用している場合は、問題がさらに複雑になります。ファイルをテキスト モードで開いている場合は、データをエンコードされたバイトからデコードされた Unicode 値に変換しています。どのコーデックが使用されるかは、OS ごと、さらにはマシンごとに異なる場合もあります。デフォルトはロケール定義 ( を使用locale.getpreferredencoding(False)) であり、データがデフォルト ロケールでデコード可能である限り、別のコーデックを使用してファイルを読み取ると、非常に異なる結果が得られます。明示的に設定するか、ファイルをバイナリモードで開くことにより、同じコーデックを確実に使用する必要があります。

バイト文字列をフィードする必要があるためhashlib、ダイジェストを計算しようとするときはそれほど問題になりません (その問題に遭遇し、少なくともそこでコーデックについて考える必要があります)。ただし、これはファイル転送にも当てはまります。テキスト ファイルに書き込むと、データがデフォルトのコーデックにエンコードされます。

于 2013-12-24T19:29:55.597 に答える