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

Copy a portion of an NSMutableData to a new NSMutableData object

我正在将一个大文件读入 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) 应该 return 一个数据对象。

如何将它获取到数据对象以将其转换回 NSMutableData?或者是否有更好的方法从大型 NSMutableData 中获取 portion/fragment?

如果您真的想要,可以将调用 lBuffer.subdata 的结果转换为 NSData,然后调用 mutableCopy() 并将结果强制转换为 NSMutableData。但是不要!一开始甚至不要使用 NSData 或 NSMutableData。这是Swift。使用数据。

var lBuffer = Data(contentsOf: myFileURL)

现在打电话给subdata(in:)

var lBufferChunk = lBuffer.subdata(in: myRange)

或下标

var lBufferChunk = lBuffer[myRange]

var 使其可变。

所以,我采用了不同的方法来解决我的问题。如您所见,我想将文件读入 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()

Matt 的回答对于最初提出问题的方式是正确的,我已将其标记为正确。只是想分享一下我最后做了什么。