Hexspeak

Hexspeakとは



Hexspeak(ヘックススピーク)は、プログラミングの世界で使われる、ちょっと変わった言葉遊びのようなものです。数字の「0」をアルファベットの「O」に、数字の「1」を「I」に、数字の「5」を「S」にといった具合に読み替えて、16進数で意味のある単語を作ることを指します。これは、メモリやデータに特定の印をつけたい時に、プログラマがよく使うテクニックです。

Hexspeakが生まれた背景



プログラマは、メモリやデータ領域に「未使用」や「異常データ」といった目印を付けたい場合があります。このような場合に、覚えやすく、かつ16進数として有効な「マジックナンバー」が必要となります。そこで、Hexspeakのテクニックを使い、16進数の文字(0~9、A~F)だけで意味のある単語を作り出す試みが生まれました。

特筆すべきマジックナンバーの例



多くのプロセッサやOS、デバッガで、Hexspeakを使ったマジックナンバーが使われています。特にデバッグ用途でよく見られます。

`0xABADBABE` ("a bad babe"):Appleが「Boot Zero Block」を表す値として使用。
`0xBAADF00D` ("bad food"):Microsoft Windowsで、`LocalAlloc`関数で確保されたメモリが初期化されていないことを示す。
`0xBADDCAFE` ("bad cafe"):OpenSolarisの`watchmalloc`ライブラリで、確保されたメモリが初期化されていないことを示す。
`0xCAFEBABE` ("cafe babe"):Javaのクラスファイルや、Mach-O形式のオブジェクトファイルを表す。
`0xDEADBEEF` ("dead beef"):IBM RS/6000システムや、macOS、Amigaなどでデバッグ用のマジックナンバーとして使用。Solarisでは、解放されたカーネルメモリを表す。
`0xDEFEC8ED` ("defecated"):OpenSolarisコアダンプで使用。
`0xFACEFEED` ("face feed"):Alphaサーバで動作するWindows NTで使用。ハードウェア障害時にエラーメッセージとして表示。
`0xFEE1DEAD` ("feel dead"):Linuxの`reboot`システムコールで使用されるマジックナンバー。
`0xC0ED` ("coed"):Linuxの`mount`システムコールで使用されるマジックナンバー。
`0xBADCAB1E` ("bad cable"):Microsoft eVCデバッガで、接続が切断された際に返されるエラーコード。
`0xFEEDFACE` ("feed face"):Mach-Oバイナリのヘッダとして使用。OpenSolarisの`watchmalloc`で不正なポインタを示す値としても使用。
`0xDEADDEAD` ("dead dead"):Windows NT系OSで、ブルースクリーンを強制的に発生させた際のSTOPコード。
`0xBEADFACE` ("bead face"または"face bead"):モトローラ製マイクロコントローラのシミュレータで、未使用メモリを埋める値として使用。
`0x0000000ff1ce` ("Office"):Microsoft OfficeコンポーネントのGUIDの末尾に使用。

マジックナンバーの作り方



利用できる文字が限られているとはいえ、"a", "b", "c", "d", "e", "f", "o", "i", "s"だけで作れる英単語はたくさんあります。そのため、Hexspeakを使ったマジックナンバーを作るのは、意外と簡単です。例えば、`0xD15EA5ED` ("diseased")や`0xBED51DE5` ("bedsides")といった値も簡単に作れます。

既存のHexspeakパターンを参考にするのも良いでしょう。既存のものはワード長と等しく、"1"や"5"で始まるものはありません。これは、符号付き整数として解釈された場合に大きな負の数になるようにするためです。例えば、`0xBAADF00D`は符号付き32ビット整数として`-1163005939`となりますが、プログラムでこのような大きな負の数が現れることは稀です。Microsoftが使用している`0xBAADF00D`は、初期化されていないメモリへのアクセスを検知するのに役立ちます。

その他の表記



C言語では、16進数であることを示すために`0x`を先頭に付けますが、Hexspeakとして読む際には無視されます。x86アセンブリ言語では、末尾に`h`を付けます(例:`0FEEDADEADF15h`)。Pascalでは、先頭に`$`を付けます(例:`$EED`)。

関連項目



Leet
マジックナンバー (プログラム)
* file (UNIX)

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。