Подтвердить что ты не робот

NSMutableData удаляет байты?

Я могу легко добавлять байты в экземпляр NSMutableData с помощью метода appendData, однако я не вижу подобного метода для удаления данных? Я что-то забываю или мне нужно создать новый объект и скопировать только те байты, которые мне нужны?

4b9b3361

Ответ 1

См. документацию по следующему методу:

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

Apple четко заявляет следующее:

Если длина диапазона не равна replacementLength, приемник для изменения новых байтов. Любой байтовый пробел в приемнике смещены для размещения новых байт. Поэтому вы можете передать NULL для replacementBytes и 0 для replaceLength для удаления байтов в приемник в диапазоне диапазона. Вы также может заменить диапазон (который может быть нулевой длиной) с большим количеством байтов, чем длина диапазона, которая имеет эффект вставки (или "заменить некоторые и вставить больше" ).

Чтобы удалить 10 байт с конца, используйте:

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

Это также можно сделать с помощью replaceBytesInRange, но на самом деле намного быстрее, потому что байты на самом деле не удалены. Вместо этого изменяется только внутренняя переменная размера, и NSMutableData будет вести себя так, как если бы байты были удалены. IOW, это операция O (1) (это означает, что она всегда будет выполняться одинаково долго, независимо от того, сколько вы удаляете байт), и это очень быстро.

Чтобы удалить 10 байт спереди, используйте:

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

Чтобы удалить 10 байтов в середине (например, после 20 байтов), используйте:

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

replaceBytesInRange - это операция O (n). Это означает, что независимо от того, сколько времени потребуется, чтобы удалить 100 байт, потребуется два раза больше, чтобы удалить 200 байт и так далее. Он все еще довольно быстрый и ограничен только пропускной способностью вашей компьютерной памяти (ОЗУ). Если у вас 10 МБ данных, и вы удаляете 1 МБ спереди, 9 МБ копируются, чтобы заполнить пробел только что снятого МБ. Таким образом, скорость операции зависит от того, насколько быстро ваша система может перемещать 9 МБ ОЗУ с одного адреса на другой. И это обычно достаточно быстро, если вы не имеете дело с объектами NSMutableData, содержащими сотни МБ.

Ответ 2

Так как NSMutableData является бесплатным мостом с CFMutableDataRef, вы можете использовать функцию CFDataDeleteBytes():

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

Ответ 3

Если данные, которые вы хотите удалить, находятся в конце, вы можете использовать

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

или с синтаксисом obj-c 2.0

NSMutableDataInstance.length -= n;

для чего-то более сложного, чем я бы рекомендовал манипулировать необработанными данными.

Ответ 4

Я вижу, что этот поток имеет ответ, но тем не менее это может быть полезно добавить. Чтобы удалить все байты из NSMuttableData, вы можете создать новые данные и скопировать их в оригинал:

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

Это отлично работает.