2014-06-23 16 views
10

मैं भाषा सीखने के तरीके के रूप में स्विफ्ट में एक MsgPack पार्सर लिख रहा हूं। यह कार्य के लिए बहुत उपयुक्त नहीं लगता है लेकिन मैं प्रगति कर रहा हूं। अब मैंने एक ब्लॉक मारा है जहां मैं 4 बाइट्स को एक फ्लोट में बदलने के लिए इसे मनाने के लिए प्रतीत नहीं कर सकता।4 बाइट्स को एक स्विफ्ट फ्लोट में कैसे परिवर्तित करें?

var bytes:Array<UInt8> = [0x9A, 0x99, 0x99, 0x41] //19.20000 

var f:Float = 0 

memccpy(&f, &bytes, 4, 4) 

print(f) 

खेल का मैदान में मैं मिलता है:

fatal error: Can't unwrap Optional.None Playground execution failed: error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).

कोई भी विचार आगे क्या करने की कोशिश करना?

+1

ड्रॉप बाइट्स पर और। – Grimxn

उत्तर

12

&&bytes परड्रॉप करें। bytes एक सरणी है।

var bytes:Array<UInt8> = [0x9A, 0x99, 0x99, 0x41] //19.20000 

    var f:Float = 0.0 

    memccpy(&f, bytes, 4, 4) // as per OP. memcpy(&f, bytes, 4) preferred 

    println ("f=\(f)")// f=19.2000007629395 

अद्यतन स्विफ्ट 3

memccpy, स्विफ्ट 3. में काम करने के लिए के रूप में टिप्पणीकारों ने कहा है memcpy का उपयोग नहीं लगता है:

import Foundation 
var bytes:Array<UInt8> = [0x9A, 0x99, 0x99, 0x41] //19.20000 

var f:Float = 0.0 

/* Not in Swift 3 
memccpy(&f, bytes, 4, 4) // as per OP. 

print("f=\(f)")// f=19.2 
*/ 

memcpy(&f, bytes, 4)/

print("f=\(f)")// f=19.2 
+5

बेहतर: 'memcpy (& f, बाइट्स, 4) '। - 'memccpy (& f, बाइट्स, 4, 4)' स्रोत बफर में बाइट '0x04' होता है तो प्रतिलिपि रोकता है। –

+0

क्या mem varpy() के दूसरे पैरामीटर की निरंतर आवश्यकता को पूरा करने के लिए 'var' भी 'let' होना चाहिए? इसके बाद यह एक कंपाइलर चेतावनी और मजबूर और बाइट्स को बाइट्स के रूप में लिखा जाना चाहिए, भले ही इसे कड़ाई से जरूरी न हो। – sketchyTech

+0

सहायता के लिए धन्यवाद। मुझे अभी भी खेल के मैदान में एक ही त्रुटि मिलती है, एक परियोजना में मैं ठीक काम करता हूं। – Brian

2
public func parseInt32(bytes:[UInt8], offset:Int)->Int32{ 

    var pointer = UnsafePointer<UInt8>(bytes) 
    pointer = pointer.advancedBy(offset) 

    let iPointer = UnsafePointer<Int32>(pointer) 
    return iPointer.memory 

} 

public func parseFloat32(bytes:[UInt8], offset:Int)->Float32{ 
    var pointer = UnsafePointer<UInt8>(bytes) 
    pointer = pointer.advancedBy(offset) 

    let fPointer = UnsafePointer<Float32>(pointer) 
    return fPointer.memory 

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