¿Cómo convertir NSData a matriz de bytes en iPhone?

Quiero convertir NSData en una matriz de bytes, así que escribo el siguiente código:

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

Pero la última línea de código muestra un error que dice “tipos incompatibles en la asignación”. Entonces, ¿cuál es la forma correcta de convertir los datos a una matriz de bytes?

No puede declarar una matriz usando una variable, por lo que Byte byteData[len]; no funcionará Si desea copiar los datos de un puntero, también necesita memcpy (que pasará por los datos apuntados por el puntero y copiará cada byte hasta una longitud específica).

Tratar:

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

Este código asignará dinámicamente la matriz al tamaño correcto (debe free(byteData) cuando haya terminado) y copiar los bytes en ella.

También puede usar getBytes:length: como lo indican otros si desea utilizar una matriz de longitud fija. Esto evita malloc / free pero es menos extensible y más propenso a problemas de desbordamiento de buffer por lo que rara vez lo uso.

También puede usar los bytes en el lugar en el que se encuentran, asignándolos al tipo que necesita.

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

Ya respondió, pero para generalizar para ayudar a otros lectores:

  //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]); } 

La firma de -[NSData bytes] es - (const void *)bytes . No puede asignar un puntero a una matriz en la stack. Si desea copiar el búfer administrado por el objeto NSData en la matriz, use -[NSData getBytes:] . Si desea hacerlo sin copiar, no asigne una matriz; solo declare una variable de puntero y deje que NSData administre la memoria por usted.

Esto se debe a que el tipo de retorno para [data bytes] es una matriz void * c-style, no una Uint8 (que es para lo que Byte es un typedef).

El error se debe a que está intentando establecer una matriz asignada cuando la devolución es un tipo de puntero, lo que está buscando es la llamada getBytes: length: que se vería así:

 [data getBytes:&byteData length:len]; 

Que llena la matriz que ha asignado con los datos del objeto NSData.

Esto es lo que creo que es el equivalente de Swift:

 if let data = NSData(contentsOfFile: filePath) { let length = data.length let byteData = malloc(length) memcmp(byteData, data.bytes, length) }