如何在 Swift 中将十六进制转换为有符号浮点数?适用于正数但不适用于负数

Posted

技术标签:

【中文标题】如何在 Swift 中将十六进制转换为有符号浮点数?适用于正数但不适用于负数【英文标题】:How do you convert a hex to signed float in Swift? Works fine with positive number but doesn't work on negative 【发布时间】:2017-03-15 00:35:51 【问题描述】:
let hexString = "0x42f9b6c9"
let toInt = Int32(truncatingBitPattern: strtoul(self, nil, 16))
let toFloat = Float(bitPattern: UInt32(self))

结果:1​​24.857

let hexString = "0xc2f9b6c9"
let toInt = Int32(truncatingBitPattern: strtoul(self, nil, 16))
let toFloat = Float(bitPattern: UInt32(self))

应用程序在此处崩溃,因为该值为负数,预期结果为 -124.857

请帮忙。谢谢!

【问题讨论】:

【参考方案1】:

strtoul 表示字符串为无符号长。试试strtol

【讨论】:

另外,UInt32 中的“U”代表“无符号”。 @creeperspeak,真的吗?说真的,我一直认为它意味着 Unicode。每天学些新东西。谢谢! (是的,现在我实际上在想,与不是 Unicode 的 Int 有什么区别。事实上, unicode Int 是什么意思?) 谢谢 :) 但是你们知道如何将其转换为签名吗? @user 你还需要说UInt32(truncatingBitPattern: ...,而不是使用Int32【参考方案2】:

最好做个String的扩展

extension String 
func hexToFloat() -> Float 
    var toInt = Int32(truncatingBitPattern: strtol(self, nil, 16))
    var float:Float32!
    memcpy(&float, &toInt, MemoryLayout.size(ofValue: float))
    print("\(float)")
    return float

例子

"0xc2f9b6c9".hexToFloat()
//-124.857
"0x41240000".hexToFloat()
//10.25

【讨论】:

以上是关于如何在 Swift 中将十六进制转换为有符号浮点数?适用于正数但不适用于负数的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中将数据帧中的符号转换为浮点数?

如何使用脚本在 Google 表格中将时间转换为十进制浮点数?

在 C# 中将 3 个字节转换为有符号整数

如何在 Delphi 中将浮点数转换为字符串,指定有效数字,而不是十进制数字(而不是 G 格式)

在 SciLab 中将十六进制转换为浮点数

在汇编中将无符号字符转换为浮点数(为浮点向量计算做准备)