iPhone开发--字节数组NSMutableData删除

文章讨论了如何在NSMutableData中使用replaceBytesInRange方法高效地删除字节,指出该方法对于大数据操作是O(n)的,但通常快速,受内存吞吐量影响。还介绍了替代的删除策略如使用NSMakeRange和NULL参数以达到O(1)效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength
Run Code Online (Sandbox Code Playgroud)

Apple明确说明如下:

如果range的长度不等于replacementLength,则调整接收器的大小以容纳新的字节.接收器中超出范围的任何字节都会移位以容纳新字节.因此,您可以为replacementBytes传递NULL,为replacementLength传递0以删除范围范围内接收器中的字节.您还可以使用比范围长度更多的字节来替换范围(可能是零长度),这具有插入的效果(或"替换一些并插入更多").

  1. 要从末尾删除10个字节,请使用:
[data setLength:[data length] - 10];

它也可以通过replaceBytesInRange来完成,但它实际上要快得多,因为字节并没有真正被删除.相反,只更改内部大小变量,NSMutableData的行为就像删除了字节一样.IOW,这是一个O(1)操作(这意味着无论你删除多少字节,它总是需要相同的长时间执行),而且速度非常快.

  1. 要从前面删除10个字节,请使用:
[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0];
  1. 要删除中间的10个字节(例如,在20个字节之后),请使用:
[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0];

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

  1. 清空
[dataresetBytesInRange:NSMakeRange(0,[datalength])];[datasetLength:0];

摘自:

  1. https://qa.1r1g.com/sf/ask/164193851/
  2. https://stackoverflow.com/questions/2345626/nsmutabledata-remove-bytes
在Objective-C中,可以通过NSData和NSString类提供的方法进行Byte数组和十六进制字符串的互转操作。 1. Byte数组转十六进制字符串: ``` // 定义一个Byte数组 Byte bytes[] = {0x12, 0x34, 0x56, 0x78}; // 将Byte数组转为NSData对象 NSData *data = [[NSData alloc] initWithBytes:bytes length:4]; // 使用NSData对象提供的方法将Byte数组转为十六进制字符串 NSString *hexString = [data description]; hexString = [hexString stringByReplacingOccurrencesOfString:@" " withString:@""]; hexString = [hexString stringByReplacingOccurrencesOfString:@"<" withString:@""]; hexString = [hexString stringByReplacingOccurrencesOfString:@">" withString:@""]; NSLog(@"hexString = %@", hexString); // 输出结果:hexString = 12345678 ``` 2. 十六进制字符串转Byte数组: ``` // 定义一个十六进制字符串 NSString *hexString = @"12345678"; // 将十六进制字符串转为NSData对象 NSMutableData *data = [[NSMutableData alloc] init]; unsigned char whole_byte; char byte_chars[3] = {'\0','\0','\0'}; for (int i=0; i<[hexString length]/2; i++) { byte_chars[0] = [hexString characterAtIndex:i*2]; byte_chars[1] = [hexString characterAtIndex:i*2+1]; whole_byte = strtol(byte_chars, NULL, 16); [data appendBytes:&whole_byte length:1]; } // 将NSData对象转为Byte数组 Byte *bytes = (Byte *)[data bytes]; for (int i=0; i<[data length]; i++) { NSLog(@"bytes[%d] = %x", i, bytes[i]); // 输出结果:bytes[0] = 12、bytes[1] = 34、bytes[2] = 56、bytes[3] = 78 } ``` 需要注意的是,使用NSData的description方法将Byte数组转为十六进制字符串时,输出结果的格式为“<12 34 56 78>”,需要使用NSString的stringByReplacingOccurrencesOfString方法去掉空格和尖括号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值