如何将我的字节数据转换为十六进制字符串,然后将有符号整数(32位)转换成两个补码...?

时间:2018-03-28 18:07:31

标签: swift hex

我有一个像下面的数据:

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)

请帮助我们获得这个价值。

1 个答案:

答案 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