Pregunta

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

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

Sin embargo, la última línea de código aparece un error que dice "tipos incompatibles en la asignación". ¿Cuál es la forma correcta de convertir los datos en el conjunto de bytes, entonces?

¿Fue útil?

Solución

No se puede declarar una matriz mediante una variable de modo Byte byteData[len]; no funcionará. Si desea copiar los datos de un puntero, también hay que memcpy (que pasará a través de los datos apuntado por el puntero y copiar cada byte hasta una longitud especificada).

Probar:

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

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

También es posible usar getBytes:length: según lo indicado por otros si desea utilizar una matriz de longitud fija. Esto evita malloc / libre, pero es menos extensible y más propensos a problemas de desbordamiento de búfer, así que casi nunca lo uso.

Otros consejos

También puedes, simplemente utilizar los bytes donde se encuentran, arrojándolos al tipo que necesita.

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

Ya contestado, pero 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 se puede asignar un puntero a una matriz en la pila. Si desea copiar el búfer gestionado por el objeto NSData en la matriz, utilice -[NSData getBytes:]. Si desea hacerlo sin copiar, entonces no asignar una matriz; acaba de declarar una variable puntero y dejar NSData gestionar la memoria para usted.

Eso es porque el tipo de cambio de [bytes de datos] es una matriz de c-estilo void *, no un Uint8 (que es lo Byte es un typedef para).

El error se debe a que usted está tratando de establecer una serie asignado cuando el retorno es un tipo de puntero, lo que busca es la getBytes: longitud: llamar a la cual se vería así:

[data getBytes:&byteData length:len];

que llena la matriz que haya asignado con datos del objeto de NSData.

Esto es lo que creo que es el equivalente Swift:

if let data = NSData(contentsOfFile: filePath) {
   let length = data.length
   let byteData = malloc(length)
   memcmp(byteData, data.bytes, length)
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top