快速使用 NSData

2023-12-27

所以我已经弄清楚如何快速提取 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]这似乎也不会飞。

我假设这是因为数组使用了不安全的缓冲区指针。有没有一个简单的电话,我有一些如何掩盖,以使作业正常工作?


如果你想modify从检索的字节NSData对象,那么你应该copy将字节放入单独的数组中

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)

是一个常量指针,因此不能修改所指向的数据。

或者,使用mutable从头开始的数据对象:

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直接地。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速使用 NSData 的相关文章

随机推荐