2012-01-19 11 views
0

に変換します。このファイルは、情報をチェックするために最初のバイトを読み取る必要があります。 Cのコードは多かれ少なかれ次のものです。それは大きなコードなので、ここで基本機能を書いただけです。CをObj-Cファイルの読み込みコード

ここでは100%Objective-Cにしたいと思いますが、正しく実行する方法が見つかりません。

FILE *f; 
char *buf; 

f = fopen ("/Users/foo/Desktop/theFile.fil", "rb"); 

if(f) { 
fseek(f , 0 , SEEK_END); 
size = ftell(f); 
rewind (f); 
buf = (char*) malloc (sizeof(char)*size); 
switch(ntohl(*(uint32 *)buf)) { 
    case 0x28BA61CE: 
    case 0x28BA4E50: 
     NSLog(@"Message"); 
    break; 
} 

fclose(f); 
free (buf); 

私はこれになった最も近いが、以下のものです:

NSData *test = [[NSData alloc] initWithContentsOfFile:filePath]; 

これは私のすべてのバイナリを取得しますが、とにかく、私は捕まってしまいました。すべてを開始しようとするといいです。

+0

なぜ組み込みの方法を使用しないのですか? '+ [NSString stringWithContentsOfFile]'など? –

+1

まず、コードが間違っているように見えます。あなたは 'malloc'でファイル全体のバッファをmallocしていて、何も読まなくてもそのバッファを検査しています。そして、あなたが述べた目標が単にファイルの先頭を読むことであるなら、大きなバッファを必要としません。 –

+0

@KevinBallardこれは一時的な解決策に過ぎません。私の目標はObj-Cを使うことなので、C言語で最良のコードを置き換えるだけでなく、私がそれに来たときに、その努力を記憶に入れて詳細をバッファできると思った。 switch文の中の値をどのように比較したいかの考え方。私はすでに使用したい16進値のリストを持っています。 – Apollo

答えて

0

まあ私はそれを選別した。

感謝して助けてくれてありがとう!

NSString *filePath = [[NSString alloc] initWithFormat:@"/Users/foo/Desktop/theFile.fil"]; 

NSData *data = [NSData dataWithContentsOfFile:filePath]; 
NSUInteger len = [data length]; 
Byte *byteData = (Byte*)malloc(len); 
memcpy(byteData, [data bytes], len); 

NSNumber *size = [[NSNumber alloc] initWithUnsignedLong:len/2^20]; 

NSLog(@"%@", size); 

switch(ntohl(*(uint32 *)byteData)) { 
    case 0x28BA61CE: 
    case 0x28BA4E50: 
     NSLog(@"Message"); 
    break; 
} 
[size release]; 
[filePath release]; 
4

まあ、有効なCコードは有効なObjective-Cコードです。だからこれはすでにObjective-Cです。

実際の目標は何ですか?ファイルで何をしようとしていますか? NSDataを使用できない理由はありますか?

+0

ファイル内のデータを識別したい。 16進数の最初の8バイトは、既に持っているリストの一部です。しかし、まず、Obj-Cのアプローチを試してみると、そのヘクスは逆になります。 2番目に、すべてのファイルをメモリに保存しないことをお勧めします。 私は、Objective-Cを使用して、プロジェクトを均等にし、文書化しておくだけです。私はそれが実装することが可能な場合、私はむしろObj - Cを好むCで、私の可能性があります。 – Apollo

+0

@GiancarloMariot:いいえ、純粋なCコードを試してみると、そのコードはその最初の4バイトをバイトスワップするための関数呼び出し( 'ntohl'への)が含まれているので、このヘクスは、そのようなスワップを行うために何もないので、Cocoaの1つのライナーで「反転される」ことはありません。私が答えて言ったように、Cocoaの読み込みコードの後に​​、バイトスワップを含む正確に同じスイッチを使用することができます。 –

1

CコードはすでにObj-Cです。あなたがすでにやっていることを使うだけで大丈夫です。しかし、これを実行するためにObj-Cオブジェクトを使用することであなたが死んでいる場合、NSInputStreamを見てみたいです。私はこれに着い

+0

ありがとう、私はそれを試してみましょう! – Apollo

0

最も近いが、以下のものです:

NSData *test = [[NSData alloc] initWithContentsOfFile:filePath]; 

これは私のすべてのバイナリを取得しますが、とにかく、私は捕まってしまいました。

これは、ココアの1つの大きなスラップでファイルを読み取る(最も単純な)正しい方法であるため、どこに止まっているのかはっきりしません。あなたは正常にファイルを読みました。それ以上のことはありません。

switchステートメントに進む場合は、読み込んだバイトのポインタは[test bytes]です。それはbufに割り当てたいポインタです。 the NSData documentationを参照してください。

+0

Objective-Cを使ってswitch文で同じデータを作ることができないので、私は立ち往生しています。私はファイルの一部だけをメモリにロードする方法を知らないので、それを実行する最良の方法は何か分かりません。どこでもファイルの部分バイトの読み込みの例は決して見つかりません。あまりにも主観的で実用的な例はありません。 – Apollo

+0

@GiancarloMariot:あなたは、ファイルの一部だけをメモリに読み込むことについて尋ねませんでした。あなたの質問にある純粋なCコードは、Cocoaの1ライナーのようにファイル全体を読み込みます。部分ファイルの目標について新しい質問をする必要があります。 –

+0

@PeterHosey:Nitpick:彼のCコードは、実際にはファイル*をすべて読み取っていません。これは、ファイルのサイズを見つけ、そのサイズのバッファを割り当て、次に割り当てたばかりのガベージメモリを検査します。 –

関連する問題