質問

私はバイト配列にNSDataを変換したいので、私は次のコードを記述します:

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

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

役に立ちましたか?

解決

あなたは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関数/無料の回避が、私はめったにそれを使用するように、オーバーフローの問題をバッファリングするために以下の拡張可能となりやすいです。

他のヒント

また、単にあなたが必要とするタイプにそれらをキャスト、彼らはバイトを使用することができます。

unsigned char *bytePtr = (unsigned char *)[data bytes];

すでに答えが、他の読者を助けるために一般化する:

    //Here:   NSData * fileData;
    uint8_t * bytePtr = (uint8_t  * )[fileData bytes];

    // Here, For getting individual bytes from fileData, uint8_t is used.
    // You may choose any other data type per your need, eg. uint16, int32, char, uchar, ... .
    // Make sure, fileData has atleast number of bytes that a single byte chunk would need. eg. for int32, fileData length must be > 4 bytes. Makes sense ?

    // Now, if you want to access whole data (fileData) as an array of uint8_t
    NSInteger totalData = [fileData length] / sizeof(uint8_t);

    for (int i = 0 ; i < totalData; i ++)
    {
        NSLog(@"data byte chunk : %x", bytePtr[i]);
    }

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

[データバイト]の戻り値の型がvoidの* Cスタイルの配列ではなく、(バイトがtypedefのあるものである)UINT8であるため、

です。

長さ:あなたはリターンがポインタ型である場合に割り当てられた配列を設定しようとしているため、

エラーが何を探していることはGetBytesメソッドである、であるように見えることになる呼び出します:

[data getBytes:&byteData length:len];

あなたはどちらNSDataオブジェクトからのデータに割り当てられている配列を埋めます。

ここで私はスウィフトと同等であると考えているものです。

if let data = NSData(contentsOfFile: filePath) {
   let length = data.length
   let byteData = malloc(length)
   memcmp(byteData, data.bytes, length)
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top