【问题标题】:Split NSData objects into other NSData objects of a given size将 NSData 对象拆分为给定大小的其他 NSData 对象
【发布时间】:2011-02-23 08:23:30
【问题描述】:

我有一个大小约为 1000kB 的 NSData 对象。现在我想通过蓝牙传输它。如果我有 10 个 100kB 的对象会更好。想到我应该使用NSData的-subdataWithRange:方法。

我还没有真正使用过 NSRange。好吧,我知道它是如何工作的,但我不知道如何从给定位置读取长度为:'to end of file'...我不知道该怎么做。

一些关于如何将其拆分为多个 100kB NSData 对象的代码将在这里真正帮助我。 (可能涉及到-length 方法来查看应该制作多少个对象..?)

提前谢谢你。

【问题讨论】:

标签: iphone split nsdata


【解决方案1】:

以下代码在不复制数据的情况下进行分片:

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);

旁注:我应该补充一点,在myBlob 被释放(或以其他方式修改)之后,不能安全地使用块对象。 chunk 片段指向 myBlob 拥有的内存,所以不要保留它们,除非你保留 myBlob

【讨论】:

  • 我没有完全理解。 NSData *chunk = [NSData dataWithBytesNoCopy:[myBlob bytes] + offset length:thisChunkSize freeWhenDone:NO]; 当然是在发出警告。我认为你不能说[myBlob bytes] + offset。偏移量与字节无关。我似乎不明白你这里的逻辑。
  • 我编辑了代码以删除编译器警告。其余的代码对我来说似乎是正确的,尽管我在没有测试的情况下编写了它。 offset 是已处理的字节数。这就是为什么每个新块都在数据数组的开头加上offset进行初始化。
  • 您是说chunk 对象指向myBlob 拥有的内存。这是否意味着当我通过蓝牙传输块时,它们会在另一端被损坏?还是您的意思是我可以发送它们,但在释放myBlob 后它们将不再可用在发件人方面?
  • 一切都取决于您的流程。在这个过程中,如果myBlob在块对象之前被释放,块对象将指向废弃的内存。在接收方,你的进程的地址空间和内存管理没有关系。
  • 谢谢!我们也可以使用 NSData *chunk = [myBlob subdataWithRange:NSMakeRange(offset, chunkSize)];
猜你喜欢
  • 2012-07-29
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多