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 ?
Réponses
Trop de publicités?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.
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.