pointers - 快速使用 NSData

标签 pointers swift nsdata

所以我想出了如何快速提取 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 是一个不可变对象(immutable对象),并且

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中的数据。

关于pointers - 快速使用 NSData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28234706/

相关文章:

c - 将指针存储到 map 中

c - 在 C 的过程中更新指针

ios - Objective-C 类是否可以在 .h 中实现 swift 协议(protocol)

swift - Heroku Vapor服务器崩溃: Possible Postgres Library Issue?

swift - 为什么可以在 Swift 中将非可选值分配给可选类型?

c - 如何通过引用传递结构并更改其值

ios - 如何按数据大小缩小 IOS 中的 UIImage

ios - Objective-C : Download PDF and Open in iBooks

python - PyObjC 的 NSString 方法问题

c# - 如何将字节数组从 C++ 返回到 C#