[iOS] xxd コマンドでファイルを 16 進ダンプする

ios

xxd コマンド

xxd コマンドは 16 進ダンプを作成するコマンドです。
このコマンドを利用してファイルを 16 進ダンプし、iOS からデータを読み取る方法を紹介します。

サンプルファイルの作成

以下のテキストファイルを用意します。

hello.txt

Hello, young skywalker.

コマンド実行

それでは以下のコマンドを実行し、テキストファイルを 16 進ダンプしてみましょう。

$ xxd hello.txt

結果はこのようになります。

0000000: 4865 6c6c 6f2c 2079 6f75 6e67 2073 6b79  Hello, young sky
0000010: 7761 6c6b 6572 2e0a                      walker..

左側の値が アドレス、右側の値が 内容、真ん中の値が 16 進ダンプの結果となります。
これが xxd コマンドの基本的な使い方です。

では次は Objective-C で扱いやすいデータ形式で出力してみましょう。
そのためのオプションは -i です。

このオプションを指定すれば、C 言語のインクルードファイル形式で出力されます。

$ xxd -i hello.txt
unsigned char hello_txt[] = {
  0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x6e, 0x67,
  0x20, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x65, 0x72, 0x2e, 0x0a
};
unsigned int hello_txt_len = 24;

あとはこれを利用したいクラスに貼り付けるだけです。
ちなみに pbcopy をパイプすることによって、出力結果をクリップボードにそのままコピーすることができます。

$ xxd -i hello.txt | pbcopy

コードへの組み込み例

ViewController.m

unsigned char hello_txt[] = {
    0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x6e, 0x67,
    0x20, 0x73, 0x6b, 0x79, 0x77, 0x61, 0x6c, 0x6b, 0x65, 0x72, 0x2e, 0x0a
};
unsigned int hello_txt_len = 24;

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *str = [[NSString alloc] initWithBytes:hello_txt
                                             length:hello_txt_len
                                           encoding:NSUTF8StringEncoding];
    NSLog(@"%@", str);
}

16 進ダンプから文字列を生成するために、NSString クラスの - initWithBytes:length:encoding: メソッドを使用しています。
第一引数に生成した 16 進ダンプの配列を、第二引数にバイト長を指定します。
どちらも xxd コマンドで自動生成されたものです。

実行結果

2016-03-16 12:40:54.343 XXD[30776:906279] Hello, young skywalker.

期待する結果が出力されることが確認できました。

テキストファイルを例として挙げましたが、画像ファイルなどにも適用することができます。

NSData *imageData = [[NSData alloc] initWithBytes:sky_png length:sky_png_len];
self.imageView.image = [UIImage imageWithData:imageData];

機密性の高いファイルをバンドルに組み込みたくない場合などに使えるかもしれません。

リンク

ミレニアム・ファルコン製作日記 #10

10 号 表紙

mfd_10_1

パーツ

mfd_10_2

mfd_10_3

mfd_10_4

成果

mfd_10_5

今回の作業は以下の 2 つでした。

  • 主船倉ドアのライニング
  • 主船倉壁を組み立てる

ファルコンの通路やドアは保護パッドで補強されています。
それを再現するために 18 個ものドアパッドを、ひとつずつ船倉ドアライナーに接着し、はめ込んでいきました。

このドアパッドは エピソード 7 の予告動画 で、ハン・ソロが登場したシーンに出ていたものと同じものだと思います。
「Chewie, we're home.」と言ってるところです。
胸がアツくなりますね。

今回は今号で提供されたパーツはひとつも使いませんでした。
このパターンは今までに無かったと思います。
こういうこともあるんですね。

また、嬉しいニュースがあります。
4/24 (日) の 13:00 から、「スター・ウォーズ 反乱者たち」シーズン 2 の新エピソードが放送されます。
シーズン 2 は感動ポイントが数多くあり、特にクローン・ウォーズのファンは必見です。
ダース・ベイダーやターキン総督も登場するので、みんなで観ましょう。

Disney XD 今月のおすすめ

それではまた次回。

May the Force be with you!