Swift中的有符号十六进制转有符号整数

3
我看到很多关于将十六进制转换为整数的问题,但这些都是无符号的->无符号的类型。我如何将有符号的十六进制转换为整数?
例如:
somefunc('0xfffff830')
= -2000
3个回答

7
你的问题意味着你正在处理32位带符号整数(否则0xfffff830不能被认为是负数),因此这将起作用:
let num = "0xfffff830"

let x = Int32(truncatingBitPattern: strtoul(num, nil, 16))
println(x) // -2000

strtoul()将十六进制字符串转换为无符号整数UInt,而Int32(truncatingBitPattern:)则从给定参数的最低32位创建一个(有符号)32位整数。


更新至Swift 4:

let num = "0xfffff830"
let x = Int32(bitPattern: UInt32(num.dropFirst(2), radix: 16) ?? 0)
print(x) // -2000

这个处理有符号和无符号的数据类型,而且代码很简洁,非常感谢! - John

2
您可以使用将数据类型转换为无符号整数,然后再将无符号整数转换为有符号整数的方法。
let num = "0xfffff830"
var result: UInt32 = 0
let converter = NSScanner(string: num)
converter.scanHexInt(&result)

print(unsafeBitCast(result, Int32.self)) // prints -2000

谢谢!这个处理正负值的情况,是另一种解决方案。 - John
还有一个不错的解决方案,我只是更喜欢使用 Int32(bitPattern: result) 而不是 unsafeBitCast(...) - Martin R

1
一种方法
var hex = UInt32(0xfffff830)
let signedHex : Int
if hex > UInt32.max / 2 {
  signedHex = -Int(~hex + 1) // ~ is the Bitwise NOT Operator
} else {
  signedHex = Int(hex)
}

不幸的是,这并没有涵盖正数范围。 - John
@vadian,你能帮忙反向处理吗(将有符号字节数组转换为十六进制)? - Shabbir Ahmad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接