在Swift中使用NSData

9

我已经找到了在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)

我遇到了一个错误:无法分配此表达式的结果。我也尝试使用&bytes[11],但似乎也不起作用。

我猜测这是因为数组使用了不安全的缓冲区指针。是否有一个简单的调用可以使赋值正确地工作?

1个回答

16

如果您想要修改从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中的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接