在开发蓝牙模块的过程中, 发现公司的硬件设备每次只能接受182字节数据, 所以不得不将稍长的数据拆分
查了一些资料, 最终采用dataWithBytesNoCopy:
方法, 利用字节初始化data, 那么这个字节在哪儿? 从哪儿取?
思路:
我们知道NSData是存放在一段连续的内存中的, 所以只要我们找到data的初始地址, 根据分段的长度, 我们可以取出每段data, 存放在数组中.
//拆分data
NSMutableArray *dataArray = [NSMutableArray array];
NSUInteger length = [data length];
NSUInteger chunkSize = 180;
NSUInteger offset = 0;
do {
NSUInteger thisChunkSize = length - offset> chunkSize? chunkSize : length - offset;
NSData* chunk = [NSData dataWithBytesNoCopy:(char *)[data bytes] + offset
length:thisChunkSize
freeWhenDone:NO];
offset += thisChunkSize;
[dataArray addObject:chunk];
} while (offset <length);
现在说说dataWithBytesNoCopy:
方法的使用
+ (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b;
有三个参数
- bytes 参数类型(void *),是个指针, 指向开始取数据的首地址
- length 数据长度
- 取完数据是否清空
参数设置:
- 我们先取到data的首地址 -- (char *)[data bytes] ,
[da bytes]
返回的就是data的指针, 指针就是指向data的第一个字节的内存位置,(char *)
指的是这个指针指向的内存中存放的是char
类型的数据,所以我们就在这里作为我们的起始位置;注意每次的初始位置是不同的,需要在最初的位置加上已经取了的数量 - length就根据需要设置了(我这里设置的是180)
- 最后一般是不对内存进行清空的,根据需要吧!