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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

10443閲覧

バイナリデータの中にある指定のヘッダまでのデータを削除あるいは指定のヘッダから次のヘッダまでの抜き出し

takase

総合スコア13

バイナリ

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/04/13 06:00

前提・実現したいこと

ダンプしたファイルを読み込んだ後に格納した変数の最初の位置から指定のヘッダまでのデータを削除あるいは指定のヘッダから次のヘッダまでのデータを抜き出したいです。

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

指定のヘッダの位置が常に変わるためf.seekを使うことができません。

該当のソースコード

from struct import *

f = open('yyyymmddhhmmss.dmp', 'rb')

data = bytearray(f.read())

試したこと

位置が常に変わるためf.seekで対応できないのでGoogleで『Python バイナリ』で検索してみたのですが対処方法が見つかりませんでした。

補足情報(FW/ツールのバージョンなど)

Windows 7 64bit
python 3.6.4 32bit

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

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

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

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

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

guest

回答2

0

御回答を参考にし指定のヘッダから次のヘッダまでのバイナリを抜き出す事ができました。
ありがとうございました!

Python

1headerS = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F' # 最初のヘッダ 2headerE = b'\x0F\x0E\x0D\x0C\x0B\x0A\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00' # 末尾のヘッダ 3headerC = '' # 比較用 4 5skip = 0 6 7with open('yyyymmddhhmmss.dmp', 'rb') as f: 8 9 while (headerS != headerC): 10 11 f.seek(skip) 12 headerC = f.read(16) 13 14 if(headerS != headerC): 15 skip = skip + 1 16 17 Start = skip 18 19 while (headerE != headerC): 20 21 f.seek(skip) 22 headerC = f.read(16) 23 24 if(headerE != headerC): 25 skip = skip + 1 26 27 End = skip 28 29 f.seek(Start) 30 data = f.read(End - Start) 31 32 with open('[dump] yyyymmddhhmmss.dmp', 'wb') as f: 33 f.write(data) 34 35f.close()

投稿2018/04/13 09:23

編集2018/04/13 09:31
takase

総合スコア13

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

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

0

ベストアンサー

指定のヘッダの位置が常に変わるためf.seekを使うことができません。

今一つ「なぜできないか」がピンときませんでした。

python

1import os 2 3skip = 10 4with open('t.py', 'rb') as f: 5 b1 = f.read(4) 6 f.seek(skip, os.SEEK_CUR) # 現在の位置から10バイトスキップ 7 b2 = f.read(4) 8 print(b1 + b2)

例えばこんな具合にしても好きなようにスキップできると思うのですが。
上の例だとファイルの先頭から4バイト、途中10バイトスキップしてその後の4バイトを連結した8バイトを求めてそれをprintしてみてます。seekの引数を好きなように変えればいいだけではないですか?

投稿2018/04/13 06:39

KSwordOfHaste

総合スコア18392

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

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

takase

2018/04/13 07:03

御回答ありがとうございます。 f.seekの基準位置の更新による比較は盲点でした。 Python初心者なため理解と検証に時間がかかると思いますが頑張って試してみますね! ありがとうございます!
KSwordOfHaste

2018/04/13 07:12

自分も何かするときはしょっちゅうリファレンスを見ます。そうすれば色々な機能を知ることができます。質問者さんもぜひそうするとよいと思います。
takase

2018/04/13 09:20

自分にはまだリファレンスを見てすぐに応用できるほどの理解が追いついていない状況ですぐに実践で応用できる方を羨ましく思います。 今後はリファレンスを熟読し見落としてる部分がないかよく考えて解決出来るように望んでみますね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問