swift - गोल यात्रा डेटा से/के लिए स्विफ्ट नंबर प्रकार




swift3 swift-data (2)

[UInt8] बजाय Data की ओर झुकाव वाली स्विफ्ट 3 के साथ, मैं विभिन्न वस्तुओं (UInt8, Double, Float, Int64, आदि) को डेटा ऑब्जेक्ट्स के रूप में बदलना / डीकोड करना सबसे कुशल / मुहावरेदार तरीका है।

[UInt8] का उपयोग करने के लिए यह उत्तर है , लेकिन यह विभिन्न पॉइंटर एपीआई का उपयोग करता प्रतीत होता है जो मुझे डेटा पर नहीं मिल सकता है।

मैं मूल रूप से कुछ कस्टम एक्सटेंशन चाहते हैं जो कुछ इस तरह दिखते हैं:

let input = 42.13 // implicit Double
let bytes = input.data
let roundtrip = bytes.to(Double) // --> 42.13

वह हिस्सा जो वास्तव में मुझे घेरता है, मैंने डॉक्स के एक समूह के माध्यम से देखा है, यह है कि मैं किसी भी मूल संरचना (जो सभी संख्याएं हैं) से किसी प्रकार की पॉइंटर चीज़ (ओपेकपॉइंट या बफ़रपॉइंट या अनसैफेपॉइंटर?) प्राप्त कर सकते हैं। सी में, मैं इसके सामने एक एम्परसेंड को थप्पड़ मारूंगा, और फिर वहां जाऊंगा।


आप उपयोग करने withUnsafePointer वस्तुओं के साथ एक असुरक्षित पॉइंटर को प्राप्त कर सकते हैं।

withUnsafePointer(&input) { /* $0 is your pointer */ }

मैं अपरिवर्तनीय वस्तुओं के लिए एक प्राप्त करने का तरीका नहीं जानता, क्योंकि इनऑउट ऑपरेटर केवल उत्परिवर्तित वस्तुओं पर काम करता है।

यह आपके द्वारा लिंक किए गए उत्तर में प्रदर्शित होता है।


मेरे मामले में, के जवाब ने मदद की लेकिन परिणाम उलटा था। इसलिए मैंने उनके कोड में एक छोटा सा बदलाव किया:

extension UInt16 : DataConvertible {

    init?(data: Data) {
        guard data.count == MemoryLayout<UInt16>.size else { 
          return nil 
        }
    self = data.withUnsafeBytes { $0.pointee }
    }

    var data: Data {
         var value = CFSwapInt16HostToBig(self)//Acho que o padrao do IOS 'e LittleEndian, pois os bytes estavao ao contrario
         return Data(buffer: UnsafeBufferPointer(start: &value, count: 1))
    }
}

समस्या LittleEndian और BigEndian से संबंधित है।






swift-data