バイナリデータとして読み込んで、bytes.find() で検索すればよいです。
組み込み型 — Python 3.8.1 ドキュメント
複数ある場合は最初に見つかったインデックス、見つからない場合は -1 を返します。
python
1data = "Hello World!"
2
3with open("sample.bin", "w") as f:
4 f.write(data)
5
6target = b"\x6f\x72\x6c"
7with open("sample.bin", 'rb') as f:
8 s = f.read()
9idx = s.find(target)
10print(idx) # 先頭から 7 bytes 目にある
追記
リンク先を参考に作ってみました。
リンク先では1バイトずつ読み込んで表示するようになっているので、あとから検索するといったことができません。
なので、read()
で中身を全部読み込んでしまって、attribute としてもっておき、あとから参照できるように変更しました。
また一部冗長な箇所も修正しました。
python
1class BinaryViewer:
2 def print_headers(self):
3 """ヘッダーを表示する。
4 """
5 print("Offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F Encode to ASCII")
6
7 def byte_to_char(self, s):
8 """ascii の英数字及び記号の場合、str に変換して返します。
9 ASCIIコード表 http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html
10 """
11 if 33 <= s < 126:
12 return chr(s)
13 else:
14 return "."
15
16 def read_file(self, filepath):
17 # ファイルを読み込む。
18 with open(filepath, "rb") as f:
19 self.data = f.read()
20
21 # ヘッダーを表示する。
22 self.print_headers()
23
24 # 1バイトずつ読み込む。
25 ascii_string = ""
26 for offset, byte in enumerate(self.data):
27 ascii_string += self.byte_to_char(byte)
28
29 if offset % 16 == 0:
30 # 先頭の列の場合、その行のオフセットを表示する。
31 print(f"{offset:06X}", end=" ")
32
33 print(f"{byte:02x}", end=" ")
34
35 if offset % 16 == 15:
36 # 末尾の列の場合、その行の ascii 文字列を表示する。
37 print(ascii_string)
38 ascii_string = ""
39
40 def search(self, target):
41 return self.data.find(target)
42
43
44viewer = BinaryViewer()
45viewer.read_file("sample.html")
46
47index = viewer.search(b"html")
48print(index)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/20 16:32
2019/12/20 17:15
2019/12/20 17:39
2019/12/20 17:48 編集