0

私はPythonの初心者で、2つのIntel hexファイル(1つはアプリケーションコード用、もう1つはブートローダー用)を取得し、最初のファイルからEOFレコードを削除し、削除されたファイルに2番目のファイルを追加するスクリプトを作成しようとしています。最初のバージョンを作成し、新しいファイルとして保存します。私はすべてが機能しているが、それからもっと凝ったものにすることに決めた。最初のファイルの最後の行が本当にIntelEOFレコード形式と一致することを確認したい。ただし、この条件付きの構文を正しく取得できないようです。

appFile = open("MyAppFile.hex", "r")
lines = appFile.readlines()
appFile.close()

appStrip = open("MyAppFile and BootFile.hex",'w')

if appStrip.readline[:] == ":00000001FF":  #Python complains about "builtin_function_or_method" not subscriptable here
    appStrip.writelines([item for item in lines[:-1]])
    appStrip.close()
else:
    print("No EOF record in last line. File may be corrupted.")

appFile = open("MyAppFile and BootFile", "r")
appObcode = appFile.read()
appFile.close()

bootFile = open("MyBootFile", "r")
bootObcode = bootFile.read()
bootFile.close()

comboData = appObcode + bootObcode

comboFile = open("MyAppFile and BootFile", "w")
comboFile.write(comboData)
comboFile.close()

これのよりクリーンまたはより安全なバージョンに関する他の提案も歓迎します。

更新:最後の行を印刷する行を追加しました。期待どおりの出力が得られますが、それでも毎回比較に失敗します。現在の完全なプログラムは次のとおりです。

appFile = open("C:/LightLock/Master/Project/Debug/Exe/Light Lock.hex")

appLines = appFile.readlines()

appFile = open("MyAppFile.hex").read()

EOF = appLines[len(appLines)-1]

print(appLines[len(appLines)-1])

if not EOF == (":00000001FF"):
    print("No EOF record in last line of file. File may be corrupted.")
else:
    with open("MyAppFile Plus Boot", "a") as appStrip:
        appStrip.writelines([item for item in appLines[:-1]])

    with open("MyAppFile Plus Boot.hex", "r") as appFile:
        appObcode = appFile.read()

    with open("MyBootFile.hex", "r") as bootFile:
        bootObcode = bootFile.read()

    comboData = appObcode + bootObcode

    with open("MyAppFile Plus Boot.hex", "w") as comboFile:
        comboFile.write(comboData)

UPDATE2:次のようにキャリッジリターンとラインフィードを含めるようにチェックを変更しようとしました。

EOF = appLines[len(appLines)-1]

print(EOF)

if EOF != (":00000001FF","\r","\n"):
    print("No EOF record in last line of file. File may be corrupted.")

まだ運がない。

4

2 に答える 2

0

より簡単なバージョンは次のとおりです。

app = open("app.hex").read()
if not app.endswith(":00000001FF"):
   print("No EOF")
combo = open("combo.hex","w")
combo.write(app)
boot = open("boot.hex").read()
combo.write(boot)
combo.close() # it's automatic after program ended
于 2013-03-07T15:24:08.927 に答える
0

最後に、Python が読み取った文字列の長さを出力するテスト コードをいくつか書きました。11文字しか表示されませんでしたが、12文字だったことがわかりました。したがって、「見えない」文字の 1 つはキャリッジ リターンまたはライン フィードでなければならないことがわかりました。両方を試しました。改行(改行)であることが判明しました。

最終的な (動作するが「最適化されていない」) コードは次のとおりです。

appFile = open("MyAppFile.hex")

appLines = appFile.readlines()

appFile = open("MyAppFile.hex").read()

EOF = appLines[len(appLines)-1]

if EOF != (":00000001FF\n"):
    print("No EOF record in last line of file. File may be corrupted.")
else:
    with open("MyAppFile and Boot.hex", "a") as appStrip:
        appStrip.writelines([item for item in appLines[:-1]])

    with open("MyAppFile and Boot.hex", "r") as appFile:
        appObcode = appFile.read()

    with open("MyBootFile.hex", "r") as bootFile:
        bootObcode = bootFile.read()

    comboData = appObcode + bootObcode

    with open("MyAppFile and Boot.hex", "w") as comboFile:
        comboFile.write(comboData)
于 2013-03-11T13:22:42.340 に答える