gpt4 book ai didi

nsdata - 新 NSData 与旧 NSData 维护字节范围

转载 作者:行者123 更新时间:2023-12-02 03:24:35 26 4
gpt4 key购买 nike

我有一个相当大的 NSData (或 NSMutableData 如果需要)对象,我想从中取出一小块并保留其余部分。由于我正在处理大量 NSData 字节,因此我不想制作大副本,而只是截断现有字节。基本上:

  • NSData *source: < 我想要的几个字节丢弃 > + < 大块字节 I想要保留>
  • NSData *目的地:<大我想保留的字节 block >

NSMutableData中有截断方法,但它们只截断结尾,而我想截断开头。我的想法是用以下方法来做到这一点:

请注意,我在原始帖子中使用了错误的(复制)方法。我已经编辑并修复了它

- (const void *)bytes

- initWithBytesNoCopy:length:freeWhenDone:

但是,我正在尝试弄清楚如何用这些来管理内存。我猜这个过程会是这样的(我把 ????s 放在我不知道该怎么做的地方):

// Get bytes
const unsigned char *bytes = (const unsigned char *)[source bytes];

// Offset the start
bytes += myStart;

// Somehow (m)alloc the memory which will be freed up in the following step
?????

// Release the source, now that I've allocated the bytes
[source release];

// Create a new data, recycling the bytes so they don't have to be copied
NSData destination = [[NSData alloc]
initWithBytesNoCopy:bytes
length:myLength
freeWhenDone:YES];

感谢您的帮助!

最佳答案

这是你想要的吗?

NSData *destination = [NSData dataWithBytes:((char *)source.bytes) + myStart
length:myLength];

我知道你说过“我不想制作一个大副本”,但这只会与你在示例中使用 getBytes:length: 所做的相同复制,所以这可能是没问题。

还有 replaceBytesInRange:withBytes:length:,您可以这样使用:

[source setLength:myStart + myLength];
[source replaceBytesInRange:NSMakeRange(0, myStart)
withBytes:NULL
length:0];

但是文档没有说明该方法如何工作(没有性能特征),并且 source 需要是 NSMutableData。

关于nsdata - 新 NSData 与旧 NSData 维护字节范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com