Hexter

Mac でバイナリファイルを開いて読む方法

役に立つ拡張子のないファイル、あるいは macOS が認識しないファイル、.bin、ファームウェアダンプ、古いゲームのセーブデータ、デバイスが書き出した何かを手にしているとします。ダブルクリックしても、何も起こらないか、TextEdit で壊れた文字の壁として開かれます。推測に頼らず、ファイル自体を危険にさらさずに、Mac でバイナリファイルを開く方法を知りたいはずです。

なぜダブルクリックでは開けないのか

macOS は、ファイルの拡張子に基づき、それがなければ種類の推測に基づいて、どのようにファイルを開くかを決めます。バイナリファイル、つまりテキストではなく生のデータを格納するファイルには、システムが認識する標準的な拡張子がありません。そのため macOS はそれらを開くのを拒むか、最も近いと判断したアプリに渡します。たいていそれは TextEdit で、バイトをテキストとしてデコードしようとし、ときおり本物の単語が顔をのぞかせる、ほぼ読めない記号を表示します。

そのノイズの中に読める単語が混じる現象は、気のせいではありません。バイナリファイルには、周囲のデータが本当にバイナリであっても、埋め込まれたテキスト(ファイルパス、ラベル、バージョン文字列)が含まれていることがよくあります。TextEdit はそのすべてをテキストとして表示するので、半分文字化けし半分見覚えのある見た目になるのです。実際には有用なものは何も見せてくれておらず、うっかり TextEdit から保存すると、ファイルを壊してしまう可能性があります。

本当に欲しいもの:ヘックス表示

バイナリファイルは単なるバイトの並びで、それぞれが 0 から 255 までの数値です。それを安全に見る標準的な方法がヘックス表示です。各バイトを 2 文字の 16 進数値(00 から FF)で表示し、オフセット列(ファイル内のどこにいるか)とテキスト列(同じバイトを ASCII として解釈したもので、読める部分向け)の隣に行として並べます。これがヘックスエディタが提供するもので、フォーマットを推測せずに実際の内容を見せてくれる唯一の表示です。

そこへたどり着く 3 つの方法

Terminal で xxd または hexdump を使う。 macOS には両方が付属しています。xxd yourfile.bin | less を実行すれば、Terminal 内にスクロール可能なヘックスダンプが得られます。高速で常に利用できますが、読み取り専用で、検索も、オフセットへの移動も、生のヘックス以上の解釈もありません。ちょっとのぞくには十分ですが、それ以上のことには不便です。

TextEdit または他のテキストエディタ。 やめましょう。上で述べたとおり、バイトをテキストとしてデコードしますが、それはバイナリデータには誤ったレンズであり、保存されてしまえばファイルを知らないうちに壊す現実的なリスクがあります。

専用のヘックスエディタ。 5 秒のちら見以上のことをするなら、これが正しいツールです。大きなファイルをスクロールしたり、特定のバイトパターンを検索したり、既知のオフセットに移動したり、あるバイトのまとまりが実際に何を表すのか(数値、日付、色、別のエンコーディングの文字列)を確認したり。Hexter はまさにこのために作られています。すべてのファイルをデフォルトで読み取り専用として開くので、見慣れないバイナリファイルを見ても、それを変更してしまうリスクはありません。Hexter はファイル全体をメモリに読み込むのではなく必要に応じてバイトを読み込むため、サイズに関係なくファイルは即座に開きます。

手順を追って

  1. ファイルを開く。 Hexter にドラッグするか、「ファイル」>「開く」を使います。まずファイルの種類を推測する必要はありません。Hexter は何でも生のバイトとして開きます。
  2. レイアウトを読む。 左のオフセット列は、ファイル内のどこにいるかを教えてくれます。中央のヘックスグリッドは各バイトを 2 文字のヘックスで表示します。右のテキストペインは、ファイルの中で実際にテキストである部分について、同じバイトを ASCII として表示します。
  3. 特定のオフセットへ移動する。 どこを見るべきかすでに分かっているなら、スクロールする代わりに ⌘J を使います。
  4. バイトを選択して確認する。 範囲を選択すると、そのデータがインスペクタサイドバーでさまざまな数値型(8、16、32、64 ビット整数、符号付きまたは符号なし、いずれのバイト順でも)として解釈されて表示されます。4 バイトがファイルサイズなのか、タイムスタンプなのか、それ以外の何かなのかは、こうして見極めます。
  5. 検索する。 手作業でスクロールするのではなく、特定の文字列やバイト列を探しているなら ⌘F を使います。
  6. 本当に何かを変更する必要があるときだけ編集を有効にする。 Hexter は明示的に編集をオンにするまでファイルを読み取り専用に保ち、オンにした後でも、変更は保存を選ぶまで元に戻せるパッチレイヤーにとどまります。ただ見ているだけの間に行うことが、オリジナルファイルに触れることはありません。

もしそのファイルが Hexter が構造的に認識するフォーマット、PNG、ZIP、Mach-O、WAV、SQLite だと分かれば、アナライズタブが実際の構造(チャンク境界、ヘッダー、フィールド)を生のバイトの隣に解析してくれるので、単なるヘックス以上のものが得られます。

これがワークフローのすべてです。開いて、3 つの列を読み、必要な場所へ移動または検索でたどり着き、あるバイト列が実際に何を意味するのか知る必要があるときに選択を確認する。推測はなく、そう指示するまで何も危険にさらされることはありません。