2016-08-24 7 views
0

10 진수 값 (리틀 엔디안)을 10 진수 값으로 변환하는 기능을 구현하는 데 어려움이 있습니다. 그래서스위프트 리틀 엔디 언 16 진수에서 10 진수로

내가 쓰고 있어요 기능 :

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

및 입력

convertHexLittleEndianToDeciaml("606d0000")에 대한

값이 반환해야 항상 4 바이트 (입력 문자열에서 이렇게 8 자)입니다 28,000

+2

6d60은 28,000이 아니라 십진법으로 28,000입니다. – WMios

+1

그리고 어떻게 되나요? 우리에게 코드를 보여주고 실패한 곳을 알려주십시오. – Losiowaty

+0

입력이 문자열이 아닌 Int 인 이유는 무엇입니까? – Alexander

답변

2

당신이 뭔가를 쓸 수 있습니다 like : (업데이트 참조)

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 

UPDATE

미안하지만, 위의 코드는 약간의 오버 플로우 문제를 가지고는, "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 
    } 
} 

UPDATE2 그래서

, 나는 발견했다 오류 케이스에 유효한 Int32을 반환하면 쉽게 발견 할 수없는 버그가 발생할 수 있습니다. 반환 유형을 Optional로 변경하고 오류가없는 경우 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") 
} 
+0

답변입니다. – WMios

+0

정말 고마워요 !! – androisojavaswift

+0

@androisojavaswift, 첫 번째 대답에서 문제가 해결되었습니다. 후자의 코드를 사용하십시오. – OOPer