我有一个像下面的数据:
let data = Data(bytes: [206, 66, 49, 62])
然后我使用此扩展名(来自How to convert Data to hex string in swift)转换为十六进制字符串:
extension Data {
struct HexEncodingOptions: OptionSet {
let rawValue: Int
static let upperCase = HexEncodingOptions(rawValue: 1 << 0)
}
func hexEncodedString(options: HexEncodingOptions = []) -> String {
let hexDigits = Array((options.contains(.upperCase) ? "0123456789ABCDEF" : "0123456789abcdef").utf16)
var chars: [unichar] = []
chars.reserveCapacity(2 * count)
for byte in self {
chars.append(hexDigits[Int(byte / 16)])
chars.append(hexDigits[Int(byte % 16)])
}
return String(utf16CodeUnits: chars, count: chars.count)
}
}
然后它将“ce42313e”作为十六进制字符串。现在我试图将其转换为有符号整数(32位)二进制补码..我尝试了几种方法,但没有找到任何完美的东西。
当我在此十六进制十进制下的波纹管链接中给出“ce42313e”时,该值为-834522818
http://www.binaryconvert.com/convert_signed_int.html
贝洛是其中一个我试图将“ce42313e”转换为int并且它给了我3460444478 ..而不是-834522818。
let str = value
let number = Int(str, radix: 16)
请帮助我们获得这个价值。
答案 0 :(得分:0)
Int(str, radix: 16)
将字符串解释为十六进制
表示 unsigned 号码。你可以把它转换成
Int32
与
let data = Data(bytes: [206, 66, 49, 62])
let str = data.hexEncodedString()
print(str) // ce42313e
let number = Int32(truncatingBitPattern: Int(str, radix: 16)!)
print(number) // -834522818
但实际上你不需要为此目的使用十六进制表示。 您的数据是带符号的32位整数的big-endian表示, 这就是你如何直接从数据中获取数字:
let data = Data(bytes: [206, 66, 49, 62])
let number = Int32(bigEndian: data.withUnsafeBytes { $0.pointee })
print(number) // -834522818