Iphone 将NSData对象拆分为给定大小的其他NSData对象

Iphone 将NSData对象拆分为给定大小的其他NSData对象,iphone,split,nsdata,Iphone,Split,Nsdata,我有一个大小约为1000kB的NSData对象。现在我想通过蓝牙传输。如果我有10个100kB的对象会更好。我想到应该使用NSData的-subdataWithRange:方法 我没有真正与NSRange合作过。嗯,我知道它是如何工作的,但我不知道如何从给定位置读取长度为“到文件末尾”的数据。。。我不知道该怎么做 一些关于如何将其拆分为多个100kB NSData对象的代码在这里对我很有帮助。(它可能涉及到-length方法来查看应该制作多少个对象……) 提前感谢。以下代码在不复制数据的情况下执

我有一个大小约为1000kB的NSData对象。现在我想通过蓝牙传输。如果我有10个100kB的对象会更好。我想到应该使用NSData的
-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字节)。”