将NSMutableData的一部分复制到新的NSMutableData对象

时间:2018-11-21 02:12:50

标签: swift macos nsdata

我正在将一个大文件读入NSMutableData对象。

var lBuffer : NSMutableData = try NSMutableData(contentsOfFile: pFilePath)

我想一次使用NSMutableData对象的一部分。因此,我尝试使用.subdata(with:NSRange),但出现错误。

var lBufferChunk : NSMutableData = lBuffer.subdata(with: NSRange(location: 0, length: lSizeOfChunk)) as! NSMutableData

我得到的错误是:
无法将类型为“ NSSubrangeData”(0x7fffa6ea3ef8)的值强制转换为“ NSMutableData”(0x7fffa6a403f8)

根据文档,.subdata(with:NSRange)应该返回一个Data对象。

如何获取数据对象以将其强制转换回NSMutableData?还是有更好的方法从大型NSMutableData中获取片段/片段?

2 个答案:

答案 0 :(得分:1)

如果确实愿意,可以将调用lBuffer.subdata的结果强制转换为NSData,然后调用mutableCopy()并将结果强制转换为NSMutableData。但是不要!首先甚至不要使用NSData或NSMutableData。这是斯威夫特。使用数据。

var lBuffer = Data(contentsOf: myFileURL)

现在只需拨打subdata(in:)

var lBufferChunk = lBuffer.subdata(in: myRange)

或下标

var lBufferChunk = lBuffer[myRange]

var使其可变。

答案 1 :(得分:0)

因此,我走了另一条路来解决我的问题。如您所见,我想将文件读入NSMutableData对象,但想一次复制它的较小部分(对于大文件)。我决定不使用一个数据对象的范围并将其传递给另一个对象,而是决定使用输入流。

var lInputStream : InputStream = InputStream(fileAtPath: pFilePath)!
var lBuffer : UnsafeMutablePointer<UInt8> = UnsafeMutablePointer<UInt8>.allocate(capacity: lBufferSize)
lInputStream.open()
while lInputStream.hasBytesAvailable {
     let read = lInputStream.read(lBuffer, maxLength: lBufferSize)
     var dataChunk = NSMutableData(length: 0)
     dataChunk?.append(lBuffer, length: read)

     ...

}
lInputStream.close()

对于问题最初提出的方式,马特的回答是正确的,我已将其标记为是。只想分享我最终做的事情。