2016-11-25 2 views
2

모두 안녕하세요,스위프트 3 : 16 진수로 음수

Int를 16 진수 값으로 변환해야합니다. 예 : -40 => D8

나는 긍정적 인 (또는 서명되지 않은) Int를위한 작동 방법이 있지만 네거티브와 함께 예상대로 작동하지 않습니다. 여기 내 코드가있다.

class func encodeHex(data:[Int]) -> String { 
    let hexadecimal = data.reduce("") { (string , element) in 
     var append = String(element, radix:16 , uppercase : false) 
     if append.characters.count == 1 { 
      append = "0" + append 
     } 
     return string + append 
    } 
    return hexadecimal 
} 

제가 -40을 통과하면 -28이됩니다.

아무도 도와 줄 수 있습니까? 고마워요 :)

답변

2

나는 모든 정수 범위 -128에 있다는 기존의 코드에서 가정 ... 127 다음이 작동합니다 :

func encodeHex(data:[Int]) -> String { 
    return data.map { String(format: "%02hhX", $0) }.joined() 
} 

"%02hhX" 형식 승베이스 (16)에 지정된 정수의 최하위 바이트를 출력 i 자리 2 자리.

예 :

print(encodeHex(data: [40, -40, 127, -128])) 
// 28D87F80 
+0

이것은 완벽합니다. 정말 고마워요. 그리고 어떻게 다른 방향으로 변환하겠습니까? –

+1

@LucasAdam :'let num = Int8 (bitPattern : UInt8 ("D8", radix : 16)!)' –

3

D8-40의 이진 표현의 마지막 바이트입니다. 나머지 세 바이트는 모두 FF입니다.

만 마지막 바이트를 나타내는 문자열을 찾고 있다면, 당신은 처음과 같이, 진수로 변환 한 후 부호없는 8 비트 정수로 전화 번호를 변환에 의해 얻을 수 있습니다

let x = UInt8(bitPattern:Int8(data)) 
let res = String(format:"%02X", x) 
+0

니스, 그것을 잘 : 당신이 반대 aswell이겠습니까 작동? D8을 얻는 것처럼, -40 –