2015-01-30 4 views
9

Так я понял, как извлечь 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], который, похоже, тоже не летает.

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

ответ

14

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