2011年6月2日木曜日

バイナリ・データをみる

ファイルの内容を16進数の数値に置換えてファイルに書き出します。つまり簡単なファイルのダンプリストを作成します。

Xcode で新規プロジェクトを Command Line Tool でType を Foundation で作成しました。NSAutoreleasePool は自動に作成されますが、この場合は必要がないので削除してもかまいません。個別のヘッダファイルを読込むのが手間なのでこうしましたが、そうでなければ Type を C で作成してやってもよいです。

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
    FILE *rfp = fopen(argv[1], "r");
    
    if (rfp == NULL) {
        NSLog(@"Failed to read the file.");
        return EXIT_FAILURE;
    }

    FILE *wfp = fopen(argv[2], "w");

    if (wfp == NULL) {
        NSLog(@"error:%s",strerror(errno));
        fclose(rfp);
        return EXIT_FAILURE;
    }
    
    off_t position;
    fseeko(rfp, 0, SEEK_END);
    position = ftello(rfp);
    fseeko(rfp, 0, SEEK_SET);
    
    int tmp;
    for (NSInteger i = 0; i < position; ++i) {
        
        tmp = fgetc(rfp);
        
        fprintf(wfp, "%02X ",tmp);
        
        if (((i + 1) % 16) == 0) {
            fprintf(wfp, "\n");
        }
    }
    
    fclose(rfp);
    fclose(wfp);
    
    [pool drain];
    return EXIT_SUCCESS;
}

出力先のファイル名のファイルが既に存在している場合、何もなしに上書きされますので、使用の際にはご注意を。

やったこと
  1. 第1引数で指定されたパスからを fopen 関数で読込み用のファイル構造体のポインタを取得します。
  2. 第2引数で指定された書出し用のを取得。それぞれが NULL であった場合は終了。
  3. 読込み専用ファイルの終端の位置を取得する。
  4. ループで1バイトずつ2桁の16進数で書込む。ファイルの終端になったらループが終了。
  5. オープンしたファイルを閉じて終了。
TIFF を開いてみると先頭2つが ”49 49 ...” か ”4D 4D ...” になっていると思います。いかがでしょうか?

0 件のコメント:

コメントを投稿