Question

Je veux convertir NSData à un tableau d'octets, donc j'écrire 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 apparaît une erreur indiquant que « types incompatibles dans l'affectation ». Quelle est la bonne façon de convertir les données en tableau d'octets alors?

Était-ce utile?

La solution

Vous ne pouvez pas déclarer un tableau en utilisant une variable si Byte byteData[len]; ne fonctionnera pas. Si vous souhaitez copier les données d'un pointeur, vous devez également memcpy (qui passera par les données pointée par le pointeur et copiez chaque octet jusqu'à une longueur spécifiée).

Essayez:

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

Ce code va allouer dynamiquement le tableau à la taille correcte (vous devez free(byteData) lorsque vous avez terminé) et copier les octets en elle.

Vous pouvez également utiliser getBytes:length: comme indiqué par d'autres si vous voulez utiliser un tableau de longueur fixe. Cela évite malloc / gratuit, mais est moins extensible et plus enclin à des problèmes de débordement de tampon si je l'utilise rarement jamais.

Autres conseils

Vous pouvez aussi utiliser les octets où ils sont, les jetant au type dont vous avez besoin.

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

déjà répondu, mais de 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]);
    }

La signature de -[NSData bytes] est - (const void *)bytes. Vous ne pouvez pas attribuer un pointeur sur un tableau sur 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, puis ne pas allouer un tableau; simplement déclarer une variable de pointeur et laissez NSData gérer la mémoire pour vous.

En effet, le type de retour pour [octets de données] est un vide * tableau c style, pas un Uint8 (qui est ce que l'octet est un typedef pour).

L'erreur est parce que vous essayez de définir un tableau attribué lorsque le rendement est un type de pointeur, ce que vous recherchez est la getBytes: longueur: appel qui ressemblerait à:

[data getBytes:&byteData length:len];

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

Voici ce que je crois est l'équivalent Swift:

if let data = NSData(contentsOfFile: filePath) {
   let length = data.length
   let byteData = malloc(length)
   memcmp(byteData, data.bytes, length)
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top