代码之家  ›  专栏  ›  技术社区  ›  umop

新的NSData和旧的NSData维护字节范围

  •  2
  • umop  · 技术社区  · 15 年前

    我有一个相当大的NSData(或者NSMutableData,如果需要的话)对象,我想从中取出一小部分并保留其余的部分。由于我正在处理大量的NSDATE字节,所以我不想做大拷贝,而是截断现有的字节。基本上:

    • NSData*源:<几个字节 想要保留>
    • 我要保留的字节块>

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

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

    - (const void *)bytes
    

    - initWithBytesNoCopy:length:freeWhenDone:
    

    // 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];
    

    谢谢你的帮助!

    4 回复  |  直到 14 年前
        1
  •  5
  •   alltom    15 年前

    这就是你想要的吗?

    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。

        2
  •  4
  •   Nick    14 年前

    NSData 具有指定范围的对象:

    - (NSData *)getSubData:(NSData *)source withRange:(NSRange)range
    {
        UInt8 bytes[range.length];
        [source getBytes:&bytes range:range];
        NSData *result = [[NSData alloc] initWithBytes:bytes length:sizeof(bytes)];
        return [result autorelease];
    }
    

    当然,您可以将其设为类方法并将其放入某种“utils”类中,或者在NSData上创建扩展。。。

        3
  •  2
  •   Ivan Marinov    12 年前

    dataWithBytesNoCopy 使旧缓冲区保持一定的偏移量。在本例中,我们“删除”前两个字节:

    source = [NSData dataWithBytesNoCopy:(char*)source.bytes + 2 length:source.length - 2];
    

    为了示例的简单性,跳过了边界检查,请添加它以方便您。

        4
  •  2
  •   Joel Fischer    11 年前

    还有一个 NSData 方法 -[subdataWithRange:(NSRange)range] 那就行了。我不知道这场演出是什么样子(我可以想象它有一两部,但我不确定)。它可以用于:

    NSData *destination = [source subdataWithRange:NSMakeRange(0, lengthIWant)];