[iOS] xxd コマンドでファイルを 16 進ダンプする
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 号 表紙
パーツ
成果
今回の作業は以下の 2 つでした。
- 主船倉ドアのライニング
- 主船倉壁を組み立てる
ファルコンの通路やドアは保護パッドで補強されています。
それを再現するために 18 個ものドアパッドを、ひとつずつ船倉ドアライナーに接着し、はめ込んでいきました。
このドアパッドは エピソード 7 の予告動画 で、ハン・ソロが登場したシーンに出ていたものと同じものだと思います。
「Chewie, we're home.」と言ってるところです。
胸がアツくなりますね。
今回は今号で提供されたパーツはひとつも使いませんでした。
このパターンは今までに無かったと思います。
こういうこともあるんですね。
また、嬉しいニュースがあります。
4/24 (日) の 13:00 から、「スター・ウォーズ 反乱者たち」シーズン 2 の新エピソードが放送されます。
シーズン 2 は感動ポイントが数多くあり、特にクローン・ウォーズのファンは必見です。
ダース・ベイダーやターキン総督も登場するので、みんなで観ましょう。
それではまた次回。
May the Force be with you!