Работа с NSData в swift

Итак, я выяснил, как извлечь NSData в swift, но я путаюсь в отношении его настройки:

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] который, похоже, тоже не летает.

Я предполагаю, что это потому, что массив использует небезопасный буфера указатель. Есть ли простой вызов, который я как-то замазал, чтобы правильно выполнить задание?

1 ответов


если вы хотите изменить байты, извлеченные из 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)

является постоянным указателем, поэтому вы не должны изменять данные, на которые указывают.

можно использовать 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 напрямую.