Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在swift中将字节转换为浮点值?_Ios_Swift_Floating Point_Byte_Nsmutabledata - Fatal编程技术网

Ios 如何在swift中将字节转换为浮点值?

Ios 如何在swift中将字节转换为浮点值?,ios,swift,floating-point,byte,nsmutabledata,Ios,Swift,Floating Point,Byte,Nsmutabledata,这是我将字节数据转换为浮点的代码。我尝试了这个网站上给出的所有答案。我得到这个“”字节数据的指数值 static func returnFloatValue(mutableData:NSMutableData)->Float { let qtyRange = mutableData.subdataWithRange(NSMakeRange(0, 4)) let qtyString = String(qtyRange) let qty

这是我将字节数据转换为浮点的代码。我尝试了这个网站上给出的所有答案。我得到这个“”字节数据的指数值

    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
    }
static func returnFloatValue(mutableData:NSMutableData)->Float
{
设qtyRange=mutableData.subdataWithRange(NSMakeRange(0,4))
设qtyString=String(qtyRange)
设qtyTrimString=qtyString.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString:))
设qtyValue=Float(strtoul(qtyTrimString,nil,16)/10)
返回qtyValue
}
谢谢使用此功能:

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
是 二进制浮点数
2000.0
。把电话号码从 您必须先将数据读入
UInt32
,然后从 big-endian托管字节顺序,然后将结果投射到 a
浮点

在Swift 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
Swift 5中,
Data
withUnsafeBytes()
方法使用(非类型的)
UnsafeRawBufferPointer
调用闭包,您可以
从原始内存加载()

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

以下是一些swift 5:

let data=data([0x44,0xfa,0x00,0x00])//0x44fa0000
让floatNb:Float=data.withUnsafeBytes{$0.load(as:Float.self)}
//注意,根据输入端的不同,可以向数据中添加.reversed()
让floatNb:Float=data.reversed().withUnsafeBytes{$0.load(as:Float.self)}
警告:如果数据小于4字节,此示例将抛出

安全数据扩展:

扩展数据{
枚举终结性{
小案例
大箱子
}
func-toFloat(endianess:endianess=.little)->Float{

guard self.count你期望什么值?@Martinar一个浮点值
1.15723e+09
(你称之为“指数值”)是一个浮点值。如果这不是您期望的结果,请告诉我们结果应该是什么以及原因。否则我们只能猜测。值应该是2000.0Btw,您不久前问了一个类似的问题:,但从未对答案作出回应。如果答案对您不起作用,那么您可以留下评论并要求澄清。我明白了错误无法将“Swift.Int”(0x111dbd1a0)类型的值强制转换为“Swift.UInt8”(0x111dbc858)。你用的是什么swift版本?非常感谢martin:)@MartinR你能添加这个过程的相反部分吗,意味着浮点到字节,这是非常紧急的。当我们有8个字节并且想要转换成2个浮点时,这将如何工作?就像在目标c中一样,我有``union{float f[2];无符号字符字节[8];}u;NSLog(@“均值:%f”,u.f[0]);NSLog(@“方差:%f”,u.f[1]);````。这一个在swift@Kapil:看一看,我在那里发布了更多关于在数据之间转换值和值数组的代码。
func floatValue(data: Data) -> Float {
    return Float(bitPattern: UInt32(bigEndian: data.withUnsafeBytes { $0.load(as: UInt32.self) }))
}