Iphone 将NSData对象拆分为给定大小的其他NSData对象
我有一个大小约为1000kB的NSData对象。现在我想通过蓝牙传输。如果我有10个100kB的对象会更好。我想到应该使用NSData的Iphone 将NSData对象拆分为给定大小的其他NSData对象,iphone,split,nsdata,Iphone,Split,Nsdata,我有一个大小约为1000kB的NSData对象。现在我想通过蓝牙传输。如果我有10个100kB的对象会更好。我想到应该使用NSData的-subdataWithRange:方法 我没有真正与NSRange合作过。嗯,我知道它是如何工作的,但我不知道如何从给定位置读取长度为“到文件末尾”的数据。。。我不知道该怎么做 一些关于如何将其拆分为多个100kB NSData对象的代码在这里对我很有帮助。(它可能涉及到-length方法来查看应该制作多少个对象……) 提前感谢。以下代码在不复制数据的情况下执
-subdataWithRange:
方法
我没有真正与NSRange合作过。嗯,我知道它是如何工作的,但我不知道如何从给定位置读取长度为“到文件末尾”的数据。。。我不知道该怎么做
一些关于如何将其拆分为多个100kB NSData对象的代码在这里对我很有帮助。(它可能涉及到-length
方法来查看应该制作多少个对象……)
提前感谢。以下代码在不复制数据的情况下执行分段操作:
NSData* myBlob;
NSUInteger length = [myBlob length];
NSUInteger chunkSize = 100 * 1024;
NSUInteger offset = 0;
do {
NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset;
NSData* chunk = [NSData dataWithBytesNoCopy:(char *)[myBlob bytes] + offset
length:thisChunkSize
freeWhenDone:NO];
offset += thisChunkSize;
// do something with chunk
} while (offset < length);
NSData*myBlob;
NSU整数长度=[myBlob长度];
NSU整数chunkSize=100*1024;
整数偏移=0;
做{
NSUInteger thisChunkSize=长度-偏移>chunkSize?chunkSize:长度-偏移;
NSData*chunk=[NSData dataWithBytesNoCopy:(char*)[myBlob字节]+偏移量
长度:thisChunkSize
freeWhenDone:否];
偏移量+=此块大小;
//用chunk做点什么
}而(偏移量<长度);
旁注:我应该补充一点,在
myBlob
被释放(或以其他方式修改)之后,chunk对象不能安全地使用<代码>区块片段指向myBlob
拥有的内存,所以不要保留它们,除非您保留myBlob
我还没有完全理解NSData*chunk=[NSData datawithbytesnopy:[myBlob字节]+偏移量长度:thishchunksize freehendone:NO]代码>当然会抛出警告。我认为你不能说[myBlob bytes]+offset
。偏移量与字节无关。我似乎不理解您的逻辑。我编辑了代码以删除编译器警告。其余的代码对我来说似乎是正确的,尽管我没有进行测试就编写了它offset
是已处理的字节数。这就是为什么每个新区块都会在数据数组的开头加上偏移量
初始化的原因。您的意思是区块
对象指向myBlob
拥有的内存。这是否意味着当我通过蓝牙传输数据块时,它们会在另一端损坏?或者你的意思是我可以发送它们,但在发布myBlob
后,它们在发送方将不再可用?这都是关于您的流程的。在这个过程中,如果myBlob
在chunk对象之前被释放,chunk对象将指向废弃的内存。在接收方,进程的地址空间和内存管理与此无关。谢谢!我们还可以使用NSData*chunk=[myBlob subdataWithRange:NSMakeRange(offset,chunkSize)];关于蓝牙数据大小,请参见“为了获得最佳性能,建议数据对象的大小保持较小(长度小于1000字节)。”