Swift小端十六进制值转十进制

Swift Little endian hex value to decimal

我在实现将十六进制值(小端)转换为十进制值的函数时遇到困难。

所以我正在编写函数:

func convertHexLittleEndianToDeciaml(input:String) -> (int) 

并且输入始终为 4 个字节(因此输入字符串中有 8 个字符)

convertHexLittleEndianToDeciaml("606d0000") 的值应该 return 28,000

你可以这样写: (查看更新)

func convertHexLittleEndianToDeciaml(input:String) -> Int32 {
    if let beValue = Int32(input, radix: 16) where input.characters.count == 8 {
        return beValue.byteSwapped
    } else {
        //or `fatalError()` or `return 0` or ...
        return Int32.min
    }
}

print(convertHexLittleEndianToDeciaml("606d0000")) //->28000

更新

抱歉,上面的代码有一些溢出问题,比如 "FF010000":

func convertHexLittleEndianToDeciaml(input:String) -> Int32 {
    if let beValue = UInt32(input, radix: 16) where input.characters.count == 8 {
        return Int32(bitPattern: beValue.byteSwapped)
    } else {
        //or `fatalError()` or `return 0` or ...
        return Int32.min
    }
}

更新2

因此,我发现 return 在错误情况下输入有效的 Int32 可能会导致无法轻易找到的错误。我建议您在错误情况下将 return 类型更改为 Optional 和 return nil。

func convertHexLittleEndianToDeciaml(input:String) -> Int32? {
    guard let beValue = UInt32(input, radix: 16) where input.characters.count == 8 else {
        return nil
    }
    return Int32(bitPattern: beValue.byteSwapped)
}

if let value = convertHexLittleEndianToDeciaml("606d0000") {
    print(value) //->28000
} else {
    print("Hex format invalid")
}

这是我编写的适用于较长数字的解决方案:

func convert(number: String) -> Int {
    var formatted = number
    if number.count <= 16 {
        let difference = 16 - number.count
        for _ in 0..<difference {
            formatted.append("0")
        }
    } else {
        return 0
    }

    let value = UInt64(formatted, radix: 16) ?? 0
    let z = value.byteSwapped
    let final = UInt64(bitPattern: Int64(z))
    return Int(final)
}