在 swift 中使用 NSData
Working with NSData in swift
所以我想出了如何在 swift 中提取 NSData 但我对设置它感到困惑:
var testBytes : [Byte] = [0x14, 0x00, 0xAB, 0x45, 0x49, 0x1F, 0xEF, 0x15,
0xA8, 0x89, 0x78, 0x0F, 0x09, 0xA9, 0x07, 0xB0,
0x01, 0x20, 0x01, 0x4E, 0x38, 0x32, 0x35, 0x56,
0x20, 0x20, 0x20, 0x00]
var msgData = NSData(bytes: testBytes, length: testBytes.count)
println("\(msgData)")
var length : Int = testBytes.count
var out: NSInteger = 0
let ptr = UnsafePointer<UInt8>(msgData.bytes)
var bytes = UnsafeBufferPointer<UInt8>(start: ptr, count: 28)
所以如果我想访问一个特定的字节,我可以用类似的东西来获取它:
let targetAddress = UInt32(bytes[2]) << 16 |
UInt32(bytes[3]) << 8 |
UInt32(bytes[4]) << 0
现在说我想设置一个类似这样的值:
bytes[11] = UInt8(UInt32(bytes[11]) | 0x0FF)
我收到 Cannot assign the result of this expression)
错误。我也尝试过使用 &bytes[11]
,它似乎也不会飞。
我假设这是因为数组使用了不安全的缓冲区指针。是否有一个简单的调用,我已经掩盖了一些让作业正常工作的方法?
如果你想修改从NSData
对象,那么你应该复制字节到一个单独的数组
var bytes = [UInt8](count: msgData.length, repeatedValue: 0)
msgData.getBytes(&bytes, length: bytes.count)
bytes[11] = UInt8(UInt32(bytes[11]) | 0x0FF)
NSData
是不可变对象,
let ptr = UnsafePointer<UInt8>(msgData.bytes)
是常量指针,不能修改指向的数据
或者,从头开始使用可变数据对象:
var msgData = NSMutableData(bytes: testBytes, length: testBytes.count)
let ptr = UnsafeMutablePointer<UInt8>(msgData.mutableBytes)
var bytes = UnsafeMutableBufferPointer<UInt8>(start: ptr, count: msgData.length)
bytes[11] = UInt8(UInt32(bytes[11]) | 0x0FF)
注意 msgData.mutableBytes
而不是 msgData.bytes
的用法。
这将直接修改msgData
中的数据。
所以我想出了如何在 swift 中提取 NSData 但我对设置它感到困惑:
var testBytes : [Byte] = [0x14, 0x00, 0xAB, 0x45, 0x49, 0x1F, 0xEF, 0x15,
0xA8, 0x89, 0x78, 0x0F, 0x09, 0xA9, 0x07, 0xB0,
0x01, 0x20, 0x01, 0x4E, 0x38, 0x32, 0x35, 0x56,
0x20, 0x20, 0x20, 0x00]
var msgData = NSData(bytes: testBytes, length: testBytes.count)
println("\(msgData)")
var length : Int = testBytes.count
var out: NSInteger = 0
let ptr = UnsafePointer<UInt8>(msgData.bytes)
var bytes = UnsafeBufferPointer<UInt8>(start: ptr, count: 28)
所以如果我想访问一个特定的字节,我可以用类似的东西来获取它:
let targetAddress = UInt32(bytes[2]) << 16 |
UInt32(bytes[3]) << 8 |
UInt32(bytes[4]) << 0
现在说我想设置一个类似这样的值:
bytes[11] = UInt8(UInt32(bytes[11]) | 0x0FF)
我收到 Cannot assign the result of this expression)
错误。我也尝试过使用 &bytes[11]
,它似乎也不会飞。
我假设这是因为数组使用了不安全的缓冲区指针。是否有一个简单的调用,我已经掩盖了一些让作业正常工作的方法?
如果你想修改从NSData
对象,那么你应该复制字节到一个单独的数组
var bytes = [UInt8](count: msgData.length, repeatedValue: 0)
msgData.getBytes(&bytes, length: bytes.count)
bytes[11] = UInt8(UInt32(bytes[11]) | 0x0FF)
NSData
是不可变对象,
let ptr = UnsafePointer<UInt8>(msgData.bytes)
是常量指针,不能修改指向的数据
或者,从头开始使用可变数据对象:
var msgData = NSMutableData(bytes: testBytes, length: testBytes.count)
let ptr = UnsafeMutablePointer<UInt8>(msgData.mutableBytes)
var bytes = UnsafeMutableBufferPointer<UInt8>(start: ptr, count: msgData.length)
bytes[11] = UInt8(UInt32(bytes[11]) | 0x0FF)
注意 msgData.mutableBytes
而不是 msgData.bytes
的用法。
这将直接修改msgData
中的数据。