質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

197閲覧

Pythonでバイナリーファイルを読み込んで解釈してアウトプットしたいがチェックサムが合わない

gaku1110

総合スコア1

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2025/06/04 10:28

実現したいこと

バイナリーファイルで632バイトの塊が複数つながっているファイルがあり,それを読み込んで項目ごとに解釈してアウトプットしたいです

前提

各塊の頭は7F7Fで始まります。
各塊の最後の2バイトはチェックサムを表しており,その2バイトを読み込んで表示したいです。

発生している問題・エラーメッセージ

バイナリファイルを特定のソフトで読み込んで確認すると,1塊目のチェックサムは74F9となっており,その次の2バイトが7F7F(2塊目開始の合図)となっております。
順番にバイナリーを読み込んでいき,最後の2バイトのところを読み込ませて表示するとE287と表示されます。
読んでいるところがずれているのかと思い,次の2バイトを読み込ませて表示すると7F7Fとなり,正しいところを読ませていることがわかりました。
さらに,確認のために7F7Fのところまで読ませるとチェックサムは74F9と正しい値を読んでくれます。
しかし,そのまま続けると2塊目以降の読み込み位置が2バイト分ずれるため,f.seek(-2,1)を追加して次の読み込み位置を戻すと,チェックサムは再びE287となります。
元のバイナリーファイルを読んでもどこにもE287はなく,なぜこのような値が読み込まれるのか,解決させるにはどうしたらいいのか全く分かりません。

該当のソースコード

Python

1ソースコード 2#Check Sum ===Check sumの読み込み 3cs_bytes = f.read(2) 4cs = list(cs_bytes) 5self.cs1=0 6self.cs1=int.from_bytes(cs[0:2], "little") #チェックサム 7 8ck_bytes = f.read(2) 9ck = list(ck_bytes) 10self.ck1=int.from_bytes(ck[0:2], "little") #チェックサム 11 12f.seek(-2,1) 13 14print(f'{self.cs1:x},{self.ck1}') 15 16 17### 試したこと 18もともとckは入れずにやっていましたが,そうすると 19cs=E287となりました 20そこで読み取り位置の確認のためckを入れました 21すると 22cs=74F9,ck=7F7F 23となりましたが,次以降の読み込みがずれました(ckに2バイト読み込ませているから当然)24 25そのため,f.seek(-2,1)を入れると 26cs=E287にもどり,ck=7F7F 27となり,ずれはなくなりました。 28 29この現象が起こる理由が全く分かりません。 30### 補足情報(FW/ツールのバージョンなど) 31 32該当箇所のバイナリーはチェックサムの2バイト手前と7F7F2バイト後までは 33B7 B7 F9 74 7F 7F 78 02 34となっております。 35

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2025/06/05 12:05

> バイナリファイルを特定のソフトで読み込んで確認すると,1塊目のチェックサムは74F9となっており,その次の2バイトが7F7F(2塊目開始の合図)となっております。 「特定のソフト」とは何でしょうか?バイナリエディタではなく何か特殊な処理をしているということでしょうか?
guest

回答1

0

Windows 11、Python 3.13.3で確認しました。

バイナリーファイルを632byte毎に区切って、最初と最後の2byteを表示するプログラムを作りました。
これはファイルの中身そのままの順で表示するので、リトルエンディアンとして解釈したい場合は、ひっくり返して読んでください。
これで0x87E2が出るか、試してみてください。

with open('test.bin', 'br') as f: data = f.read() offset = 0 size = len(data) while offset < size: print(data[offset:offset + 2].hex()) print(data[offset + 630:offset + 632].hex()) offset += 632 f.close()

投稿2025/06/04 14:44

hiroki-o

総合スコア1390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gaku1110

2025/06/05 03:34

回答ありがとうございます。 最初のアンサンブルに関して faff 1100 と表示されました。
gaku1110

2025/06/05 03:57

ファイルの開始は7F7Fのはずなんですが,なぜだかわかりますでしょうか
otn

2025/06/05 11:18

> ファイルの開始は7F7Fのはずなんですが,なぜだかわかりますでしょうか その「はず」という予想が間違っていないことはどうやって検証しましたか? powershell -Command "format-hex test.bin" | more でファイルの中身を見てみましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問