49 votes

Comment convertir NSData en tableau d'octets sur iPhone?

Je veux convertir NSData en un tableau d'octets, alors j'écris le code suivant:

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

Mais la dernière ligne de code affiche une erreur disant "types incompatibles en affectation". Quelle est la bonne façon de convertir les données en tableau d'octets?

62voto

Matt Gallagher Points 10431

Vous ne pouvez pas déclarer un tableau à l'aide d'une variable afin Byte byteData[len]; ne fonctionne pas. Si vous voulez copier les données à partir d'un pointeur, vous devez également memcpy (qui va parcourir les données pointé par le pointeur et la copie de chaque octet jusqu'à une longueur donnée).

Essayez:

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

Ce code permettra d'allouer dynamiquement le tableau de la bonne taille (vous devez free(byteData) lorsque vous avez terminé) et de copier les octets en elle.

Vous pouvez également utiliser getBytes:length: comme indiqué par d'autres, si vous souhaitez utiliser une longueur fixe de tableau. Cela évite de malloc/free, mais est moins extensible, et plus enclin à débordement de la mémoire tampon de questions alors j'ai rarement jamais l'utiliser.

43voto

stevex Points 2585

Vous pouvez également simplement utiliser les octets où ils se trouvent, en les convertissant dans le type dont vous avez besoin.

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

16voto

Khulja Sim Sim Points 460

Déjà répondu, mais à généraliser pour aider les autres lecteurs:

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

10voto

Nicholas Riley Points 26161

La signature de -[NSData bytes] est - (const void *)bytes . Vous ne pouvez pas affecter de pointeur à un tableau de la pile. Si vous souhaitez copier le tampon géré par l'objet NSData dans le tableau, utilisez -[NSData getBytes:] . Si vous voulez le faire sans copier, alors n'allouez pas un tableau; déclarez simplement une variable de pointeur et laissez NSData gérer la mémoire pour vous.

2voto

En effet, le type de retour pour [octets de données] est un tableau void * c-style, et non un Uint8 (ce pour quoi Byte est un typedef).

L'erreur est due au fait que vous essayez de définir un tableau alloué lorsque le retour est un type de pointeur. Vous recherchez simplement getBytes: length: call qui ressemblerait à ceci:

 [data getBytes:&byteData length:len];
 

Ce qui remplit le tableau que vous avez alloué avec les données de l'objet NSData.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X