2015-01-30 21 views
9

Vì vậy, tôi đã tìm ra cách để trích xuất NSData trong nhanh chóng nhưng tôi đang nhận được nhầm lẫn liên quan đến thiết lập nó:Làm việc với NSData trong nhanh chóng

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) 

Vì vậy, nếu tôi muốn truy cập vào một byte cụ thể tôi có thể có được nó với một cái gì đó như:

let targetAddress = UInt32(bytes[2]) << 16 | 
    UInt32(bytes[3]) << 8 | 
    UInt32(bytes[4]) << 0 

Bây giờ nói rằng tôi muốn đặt một giá trị với một cái gì đó như:

bytes[11] = UInt8(UInt32(bytes[11]) | 0x0FF) 

tôi nhận được một lỗi của Cannot assign the result of this expression). Tôi cũng đã thử sử dụng &bytes[11] mà dường như không bay.

Tôi giả định điều này là do mảng sử dụng một con trỏ đệm không an toàn. Có một cuộc gọi dễ dàng mà tôi đã có một số làm thế nào glossed hơn để làm cho công việc chuyển nhượng một cách chính xác?

Trả lời

14

Nếu bạn muốn sửa đổi các byte lấy từ đối tượng NSData , sau đó bạn nên sao chép các byte vào một mảng riêng biệt

var bytes = [UInt8](count: msgData.length, repeatedValue: 0) 
msgData.getBytes(&bytes, length: bytes.count) 

bytes[11] = UInt8(UInt32(bytes[11]) | 0x0FF) 

NSData là một đối tượng bất biến, và

let ptr = UnsafePointer<UInt8>(msgData.bytes) 

là một con trỏ không đổi, vì vậy bạn không được sửa đổi dữ liệu được chỉ định.

Ngoài ra, sử dụng một đối tượng có thể thay đổi dữ liệungay từ đầu:

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) 

Lưu ý việc sử dụng msgData.mutableBytes thay vì msgData.bytes. Điều này sẽ sửa đổi dữ liệu trong msgData trực tiếp.

Các vấn đề liên quan