2016-12-15 50 views
1

这是我的代码将字节数据转换为浮点数。我试着在这个网站给出的每个答案。我得到的指数值,对于这种 “< 44fa0000>” 字节数据如何在Swift中将字节转换为浮点值?

static func returnFloatValue(mutableData:NSMutableData)->Float 
    { 
     let qtyRange = mutableData.subdataWithRange(NSMakeRange(0, 4)) 
     let qtyString = String(qtyRange) 
     let qtyTrimString = qtyString.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")) 
     let qtyValue = Float(strtoul(qtyTrimString, nil, 16)/10) 
     return qtyValue 
    } 

感谢

+0

你期望什么值? –

+0

@MartinR浮点值 –

+0

'1.15723e + 09'(你称之为“指数值”)*是一个浮点值。如果这不符合您的期望,请告诉我们结果应该是什么以及为什么。否则,我们只能猜测。 –

回答

7

<44fa0000>big-endian内存表示的 二进制浮点数2000.0。要从 中获取数据,首先必须将其读入UInt32,然后将 big-endian转换为主机字节序,然后将结果转换为 a Float

夫特2这将是

func floatValueFromData(data: NSData) -> Float { 
    return unsafeBitCast(UInt32(bigEndian: UnsafePointer(data.bytes).memory), Float.self) 
} 

实施例:

let bytes: [UInt8] = [0x44, 0xFA, 0x00, 0x00] 
let data = NSData(bytes: bytes, length: 4) 

print(data) // <44fa0000> 
let f = floatValueFromData(data) 
print(f) // 2000.0 

夫特3你会使用Data代替NSData,并且 unsafeBitCast可以通过更换Float(bitPattern:) 初始值设定项:

func floatValue(data: Data) -> Float { 
    return Float(bitPattern: UInt32(bigEndian: data.withUnsafeBytes { $0.pointee })) 
} 
+0

非常感谢马丁.. :) –

+0

@MartinR你可以请添加这个过程的反向,意味着浮动到字节,这是非常紧急的。 –

0

使用此功能:

static func returnFloatValue(data: NSMutableData) -> Float { 
    let bytes = [UInt8](data as Data) 
    var f: Float = 0 

    memcpy(&f, bytes, 4) 
    return f 
} 

而且你可以看到它在这里的行动:

var initialValue: Float = 19.200 

let data = NSMutableData(bytes: &initialValue, length: 4) 

func returnFloatValue(data: NSMutableData) -> Float { 
    let bytes = [UInt8](data as Data) 
    var f: Float = 0 

    memcpy(&f, bytes, 4) 
    return f 
} 

var result:Float = returnFloatValue(data: data) 

print("f=\(result)")// f=19.2 
+0

我收到此错误无法将类型'Swift.Int'(0x111dbd1a0)的值转换为'Swift.UInt8'(0x111dbc858)。 –

+0

你使用什么swift版本? – vladiulianbogdan

相关问题