49

バイト配列に変換したいNSDataので、以下のコードを書きます。

NSData *data = [NSData dataWithContentsOfFile:filePath];
int len = [data length];
Byte byteData[len];
byteData = [data bytes];

しかし、コードの最後の行で、「割り当てに互換性のない型」というエラーが表示されます。データをバイト配列に変換する正しい方法は何ですか?

4

6 に答える 6

62

変数を使用して配列を宣言することはできないため、機能しByte byteData[len];ません。ポインターからデータをコピーする場合は、memcpy も必要です (ポインターが指すデータを調べて、各バイトを指定された長さまでコピーします)。

試す:

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

このコードは、配列を正しいサイズに動的に割り当て (free(byteData)完了したら必要です)、バイトをそこにコピーします。

getBytes:length:固定長配列を使用する場合は、他の人が示すように使用することもできます。これは malloc/free を回避しますが、拡張性が低く、バッファ オーバーフローの問題が発生しやすいため、私はめったに使用しません。

于 2009-04-07T06:39:04.717 に答える
43

また、必要なタイプにキャストして、バイトをそのまま使用することもできます。

unsigned char *bytePtr = (unsigned char *)[data bytes];
于 2010-12-03T20:09:26.870 に答える
10

の署名は-[NSData bytes]です- (const void *)bytes。スタック上の配列にポインターを割り当てることはできません。オブジェクトが管理するバッファをNSData配列にコピーする場合は、 を使用します-[NSData getBytes:]。コピーせずに実行したい場合は、配列を割り当てないでください。ポインタ変数を宣言するだけでNSData、メモリを管理できます。

于 2009-04-07T04:05:41.077 に答える
2

これは、[data bytes] の戻り値の型が Uint8 ではなく void* C スタイルの配列であるためです (これが Byte の typedef です)。

エラーは、戻り値がポインター型であるときに割り当てられた配列を設定しようとしているためです。探しているのは、次のような getBytes:length: 呼び出しです。

[data getBytes:&byteData length:len];

割り当てた配列を NSData オブジェクトからのデータで埋めます。

于 2009-04-07T04:07:03.677 に答える