30 votes

NSMutableData supprime les octets ?

Je peux facilement ajouter des octets à une instance NSMutableData en utilisant la fonction appendData mais je ne vois pas de méthode similaire pour la suppression des données. Est-ce que je néglige quelque chose ou dois-je créer un nouvel objet et copier uniquement les octets dont j'ai besoin ?

76voto

Mecki Points 35351

Veuillez consulter la documentation de la méthode suivante :

- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength

Apple dit clairement ce qui suit :

Si la longueur de l'intervalle n'est pas égale à replacementLength, le récepteur est redimensionné pour accueillir les nouveaux octets. Tous les octets situés au-delà de la plage dans le récepteur sont décalés pour accueillir les nouveaux octets. Vous pouvez donc passer NULL pour replacementBytes et 0 pour replacementLength pour supprimer les octets dans le récepteur dans l'intervalle de la plage. Vous pouvez également remplacer une plage (qui peut être de longueur nulle) avec un nombre d'octets supérieur à la longueur de la plage, ce qui a l'effet effet d'insertion (ou "remplacer certains et insérer plus").

Pour enlever 10 octets de la fin, utilisez :

[data setLength:[data length] - 10];

On pourrait aussi le faire via replaceBytesInRange, mais c'est en fait beaucoup plus rapide, car les octets ne sont pas vraiment supprimés. Au lieu de cela, seule la variable de taille interne est modifiée et NSMutableData se comportera comme si les octets avaient été supprimés. Autrement dit, il s'agit d'une opération O(1) (ce qui signifie qu'elle prendra toujours le même temps, quel que soit le nombre d'octets supprimés), et elle est très rapide.

Pour retirer 10 octets de l'avant, utilisez :

[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0];

Pour supprimer 10 octets au milieu (par exemple, après 20 octets), utilisez :

[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0];

replaceBytesInRange est une opération O(n), cependant. Cela signifie que quel que soit le temps nécessaire pour supprimer 100 octets, il faudra deux fois plus de temps pour supprimer 200 octets et ainsi de suite. Cette opération reste assez rapide et n'est limitée que par le débit de la mémoire (RAM) de votre ordinateur. Si vous avez 10 Mo de données et que vous enlevez 1 Mo devant, 9 Mo sont copiés pour combler le vide du Mo qui vient d'être enlevé. La vitesse de l'opération dépend donc de la vitesse à laquelle votre système peut déplacer 9 Mo de RAM d'une adresse à une autre. Et c'est généralement assez rapide, sauf si vous traitez des objets NSMutableData contenant des centaines de Mo.

3voto

RJ. Points 199

Comme NSMutableData est ponté sans frais avec CFMutableDataRef, vous pouvez utiliser la fonction CFDataDeleteBytes() :

NSMutableData *data = ...
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4));

1voto

Jared Pochtar Points 3240

Si les données que vous voulez supprimer sont à la fin, vous pouvez utiliser

[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];

ou avec la syntaxe obj-c 2.0

NSMutableDataInstance.length -= n;

pour quelque chose de plus compliqué que ça, je recommande de manipuler les données brutes.

0voto

Gossamer Points 226

Je vois que ce fil de discussion a la réponse, mais néanmoins cela pourrait être un ajout précieux. Pour supprimer tous les octets de NSMuttableData, vous pouvez créer un nouveau Data et le copier sur l'original :

[myData setData:[NSData dataWithBytes:NULL length:0]];

Cela fonctionne très bien.

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