将 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 的回答对于最初提出问题的方式是正确的,我已将其标记为正确。只是想分享一下我最后做了什么。
我正在将一个大文件读入 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 的回答对于最初提出问题的方式是正确的,我已将其标记为正确。只是想分享一下我最后做了什么。