NSMutableData удалить байты?

Для этого есть (в R2015a) встроенная и документированная функция, repelem . Следующий синтаксис, где второй аргумент является вектором, имеет значение здесь:

W = repelem(V,N), с вектором V и вектором N, создает вектор W, где элемент V(i) повторяется N(i) раз.

blockquote>

Или иначе: «Каждый элемент из N указывает количество раз, чтобы повторить соответствующий элемент из V».

Пример:

>> a=[1,3,2,5]
a =
     1     3     2     5
>> b=[2,2,1,3]
b =
     2     2     1     3
>> repelem(a,b)
ans =
     1     1     3     3     2     5     5     5

26
задан Dan Rosenstark 12 February 2012 в 23:03
поделиться

3 ответа

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

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

Apple четко говорит следующее:

Если длина диапазона не равна replaceLength, приемник размер изменен для размещения новых байтов. Любые байты за пределами диапазона в приемнике сдвинуты, чтобы приспособиться к новым байтов. Поэтому вы можете передать NULL для replaceBytes и 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 байтов и так далее займет в два раза больше времени.Это все еще довольно быстро и ограничивается только пропускной способностью памяти вашего компьютера (RAM). Если у вас есть 10 МБ данных и вы удаляете 1 МБ спереди, 9 МБ копируются, чтобы заполнить пробел в только что удаленном МБ. Таким образом, скорость операции зависит от того, насколько быстро ваша система может переместить 9 МБ ОЗУ с одного адреса на другой. И обычно этого бывает достаточно быстро, если вы не имеете дело с объектами NSMutableData, содержащими сотни МБ.

72
ответ дан 28 November 2019 в 06:21
поделиться

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

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

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

NSMutableDataInstance.length -= n;

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

1
ответ дан 28 November 2019 в 06:21
поделиться

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

NSMutableData *data = ...
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4));
3
ответ дан 28 November 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: