我可以通过使用 appendData 方法,但是我看不到任何类似的删除数据的方法吗?我是在忽略某些东西,还是需要创建一个新对象并仅通过我需要的字节复制?

有帮助吗?

解决方案

请参阅以下方法的文档:

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

苹果清楚地说了以下内容:

如果范围的长度不等于替换长度,则调整接收器以容纳新字节。接收器中的任何字节过去范围都会移动以适应新的字节。因此,您可以将null传递给替换类别,而0替换为0,以删除范围内接收器中的字节。您还可以用比范围的长度更换范围(可能为零长度),该范围具有插入的效果(或“替换一些并插入更多”)。

要删除10个字节,请使用:

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

它也可以通过替换bytesinrange完成,但实际上要快得多,因为字节并未真正删除。取而代之的是,只有内部大小变量被更改,而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];

不过,替换Bytesinrange是O(n)操作。这意味着无论删除100个字节需要多长时间,删除200个字节等需要两倍的时间。它仍然很快,仅受计算机内存(RAM)的吞吐量的限制。如果您有10 MB的数据,并且从前面删除1 MB,则复制9 MB以填补刚刚去除的MB的空白。因此,操作的速度取决于您的系统可以将9 MB的RAM从一个地址移动到另一个地址的速度。而且,这通常足够快,除非您处理包含数百个MB的NSMutableData对象。

其他提示

应该有一个功能事件接收器,它将以编程方式向库添加内容类型,请查看有任何

如果您要删除的数据在最后,您可以使用

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

或使用OBJ-C 2.0语法

NSMutableDataInstance.length -= n;

对于比这更复杂的事情,我建议您操纵原始数据。

我看到这个线程有答案,但是这可能是有价值的。要删除NSMutTableData中的所有字节,您可以创建新数据并将其复制到原始数据:

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

这很棒。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top