Swift Little endian十六进制值为十进制

时间:2016-08-24 21:31:18

标签: ios swift endianness

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

所以我正在写函数:

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

和输入总是4个字节(因此输入字符串中有8个字符)

<{1}}的

值应返回convertHexLittleEndianToDeciaml("606d0000")

2 个答案:

答案 0 :(得分:3)

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

    // container element
    var e = document.createElement('div');
    // child element with class 'large button 1 jackson'
    e.innerHTML = '<div class="large button 1 jackson">some text</div>';
    // insert the container element
    document.body.appendChild(e);
    // new element
    var newElem = document.createElement('textarea');
    // find a element with jackson class (using .jackson as selector)
    var jackson = e.querySelector('.jackson');
    // insert new element
    jackson.appendChild(newElem);

<强>更新

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

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

<强> UPDATE2

因此,我发现在错误情况下返回有效的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 } } 可能会导致无法轻易找到的错误。我建议你将返回类型更改为Optional,并在错误的情况下返回nil。

Int32

答案 1 :(得分:0)

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

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)
}