2014-12-04 6 views
6

को स्ट्रक्चर करने के लिए एनएसडीटा और एनएसडेटा को स्ट्रक्चर करना मैं समझने की कोशिश कर रहा हूं कि स्ट्रिफ्स के भीतर structs कैसे काम करते हैं। मैं के साथ कैसे नेट उन्हें संभालती है और कैसे यह पैक एक संरचना में बाइट्स परिचित हूँ, आदिस्विफ्ट के साथ स्ट्रक्चर (बाइट्स) का उपयोग करना -

मैं निम्नलिखित कोड के साथ कुछ weirdness खोजने हूँ:

struct exampleStruct { 
    var ModelNumber: Byte! 
    var MajorVersion: Byte! 
    var MinorVersion: Byte! 
    var Revision: Byte! 
} 


var myStruct = exampleStruct (
    ModelNumber: 1, 
    MajorVersion: 2, 
    MinorVersion: 3, 
    Revision: 4 
) 

myStruct.MinorVersion // << Returns 3 

// Struct to NSData. 
var data = NSData(
    bytes: &myStruct, 
    length: sizeof(exampleStruct) 
) 

println("data: \(data)") 

println रिटर्न: "डेटा: < 01,000,200 03,000,400> "

मैं वास्तव में होना करने के लिए डेटा उम्मीद कर रहा था:" डेटा: < 01,020,304> "

किसी भी विचार क्यों स्विफ्ट पैकिंग नहीं है 1 के रूप में बाइट 1 बाइट, बजाय यह 2 बाइट्स के रूप में एक बाइट पैकिंग है (1 बाइट मूल्य और 1 बाइट के रूप में 00)?

दूसरा पहलू अगर मैं निम्न कार्य पर:

var newStruct = exampleStruct(ModelNumber: nil, MajorVersion: nil, MinorVersion: nil, Revision: nil) 

var sendBytes:[Byte] = [0x1, 0x2, 0x3, 0x4] 
var newData = NSData(bytes: sendBytes, length: sendBytes.count) 

newData.getBytes(
    &newStruct, 
    length: sizeof(exampleStruct) 
) 

newStruct.MinorVersion // << Returns nil 

println(newData) 

println (newData) सही है और मैं मूल्य में क्या उम्मीद: < 01,020,304>

हालांकि, जब मैं minorVersion इसे उपयोग शून्य लौटाता है, जो मुझे अपेक्षित नहीं था 3.

क्या बाइट के पैकिंग का सम्मान करने के लिए संरचना को मजबूर करने का कोई तरीका है?

उत्तर

2

Byte! से Byte बदलें। यह अभी भी रूप में आप की आवश्यकता हो सकती काम नहीं कर रहा हो सकता है:

नहीं तो आप जो बड़े से एक बाइट क्योंकि इसके अलावा में एक बाइट धारण करने के लिए है, यह अगर यह होता है nil

नोट से संकेत मिलता है अतिरिक्त बाइट की जरूरत है Optional<Byte> पकड़े struct पैदा कर रहे __attribute__((packed)) जैसे कुछ संकलक को संरेखण के साथ सौदा करने के लिए कहने के लिए। AFAIK, यह स्विफ्ट में उपलब्ध नहीं है।

+0

धन्यवाद! यह काम करता है और स्पष्टीकरण के लिए धन्यवाद, यह समझ में आता है। – Mavro

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