Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将Swift小端十六进制值转换为十进制_Ios_Swift_Endianness - Fatal编程技术网

Ios 将Swift小端十六进制值转换为十进制

Ios 将Swift小端十六进制值转换为十进制,ios,swift,endianness,Ios,Swift,Endianness,我在实现将十六进制值(小端)转换为十进制值的函数时遇到困难 所以我在写函数: func convertHexLittleEndianToDeciaml(input:String) -> (int) 并且输入总是4个字节(所以输入字符串中有8个字符) convertexhlittleendiantodeciaml(“606d0000”)的值应返回28000您可以这样写: (见更新) 更新 很抱歉,上面的代码有一些溢出问题,例如“FF010000”: 更新2 因此,我发现在错误情况下返回

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

所以我在写函数:

func convertHexLittleEndianToDeciaml(input:String) -> (int) 
并且输入总是4个字节(所以输入字符串中有8个字符)


convertexhlittleendiantodeciaml(“606d0000”)的值应返回
28000

您可以这样写: (见更新)


更新

很抱歉,上面的代码有一些溢出问题,例如“FF010000”:

更新2

因此,我发现在错误情况下返回一个有效的
Int32
,可能会导致一个不容易发现的bug。我建议您将返回类型更改为可选,并在出现错误时返回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)
}
func转换(数字:字符串)->Int{
var格式=数字

如果number.count 6d60的十进制数是28000,而不是280。那么它返回的是什么?向我们展示您的代码并告诉我们失败的地方:)为什么您的输入是字符串而不是Int?输入字符串可以有多短/多大?为什么在您的示例中它的字符数是奇数?抱歉,伙计们,我刚刚更新了问题。@WMios@Martin$这是答案非常感谢!!@androisojavaswift,我在第一个答案中解决了一些问题。请使用后一个代码。另外值得注意的是,字符串和基数为16的整数初始化(init(:radix:))必须以大端表示字符串。这解释了为什么使用byteswaped作为提问者需要一点端的解释。
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)
}