2015-01-30 6 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) 

मैं 012 की कोई त्रुटि मिलती है। मैंने &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 में सीधे संशोधित करेगा।

संबंधित मुद्दे