【问题标题】:How to convert my bytes data to Hex String and then Signed integer (32-bit) Two's complement from that ..?如何将我的字节数据转换为十六进制字符串,然后将其转换为有符号整数(32 位)二进制补码..?
【发布时间】:2018-03-28 18:07:31
【问题描述】:

我有如下数据:

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)

请帮助获取该值。

【问题讨论】:

标签: swift hex


【解决方案1】:

Int(str, radix: 16) 将字符串解释为十六进制 无符号数的表示。您可以将其转换为 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 位整数的大端表示, 这就是您可以直接从数据中获取数字的方式:

let data = Data(bytes: [206, 66, 49, 62])
let number = Int32(bigEndian: data.withUnsafeBytes { $0.pointee })
print(number) // -834522818

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2012-08-03
    • 2011-04-11
    • 1970-01-01
    • 2015-11-29
    相关资源
    最近更新 更多