回答編集履歴

2

d

2019/12/20 17:14

投稿

tiitoi
tiitoi

スコア21960

test CHANGED
@@ -37,3 +37,119 @@
37
37
 
38
38
 
39
39
  ![イメージ説明](fdd1e74166f3a1076eb4fc3fe8411a36.png)
40
+
41
+
42
+
43
+ ## 追記
44
+
45
+
46
+
47
+ リンク先を参考に作ってみました。
48
+
49
+ リンク先では1バイトずつ読み込んで表示するようになっているので、あとから検索するといったことができません。
50
+
51
+ なので、`read()` で中身を全部読み込んでしまって、attribute としてもっておき、あとから参照できるように変更しました。
52
+
53
+ また一部冗長な箇所も修正しました。
54
+
55
+
56
+
57
+ ```python
58
+
59
+ class BinaryViewer:
60
+
61
+ def print_headers(self):
62
+
63
+ """ヘッダーを表示する。
64
+
65
+ """
66
+
67
+ print("Offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F Encode to ASCII")
68
+
69
+
70
+
71
+ def byte_to_char(self, s):
72
+
73
+ """ascii の英数字及び記号の場合、str に変換して返します。
74
+
75
+ ASCIIコード表 http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html
76
+
77
+ """
78
+
79
+ if 33 <= s < 126:
80
+
81
+ return chr(s)
82
+
83
+ else:
84
+
85
+ return "."
86
+
87
+
88
+
89
+ def read_file(self, filepath):
90
+
91
+ # ファイルを読み込む。
92
+
93
+ with open(filepath, "rb") as f:
94
+
95
+ self.data = f.read()
96
+
97
+
98
+
99
+ # ヘッダーを表示する。
100
+
101
+ self.print_headers()
102
+
103
+
104
+
105
+ # 1バイトずつ読み込む。
106
+
107
+ ascii_string = ""
108
+
109
+ for offset, byte in enumerate(self.data):
110
+
111
+ ascii_string += self.byte_to_char(byte)
112
+
113
+
114
+
115
+ if offset % 16 == 0:
116
+
117
+ # 先頭の列の場合、その行のオフセットを表示する。
118
+
119
+ print(f"{offset:06X}", end=" ")
120
+
121
+
122
+
123
+ print(f"{byte:02x}", end=" ")
124
+
125
+
126
+
127
+ if offset % 16 == 15:
128
+
129
+ # 末尾の列の場合、その行の ascii 文字列を表示する。
130
+
131
+ print(ascii_string)
132
+
133
+ ascii_string = ""
134
+
135
+
136
+
137
+ def search(self, target):
138
+
139
+ return self.data.find(target)
140
+
141
+
142
+
143
+
144
+
145
+ viewer = BinaryViewer()
146
+
147
+ viewer.read_file("sample.html")
148
+
149
+
150
+
151
+ index = viewer.search(b"html")
152
+
153
+ print(index)
154
+
155
+ ```

1

f

2019/12/20 17:13

投稿

tiitoi
tiitoi

スコア21960

test CHANGED
@@ -33,3 +33,7 @@
33
33
  print(idx) # 先頭から 7 bytes 目にある
34
34
 
35
35
  ```
36
+
37
+
38
+
39
+ ![イメージ説明](fdd1e74166f3a1076eb4fc3fe8411a36.png)