2016-11-25 17 views
2

Hy everyone、スイフト3:負のIntから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

私は、これは動作します127 ...すべての整数が範囲 -128であり、既存のコードから想定しています

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 "、基数:16)!)' –

3

D8は、-40のバイナリ表現の最後のバイトです。残りの3バイトはすべてFFです。

あなただけの最後のバイトを表す文字列を探している場合は、まずこのように、符号なし8ビット整数にあなたの番号を変換し、次に進に変換することにより取得できます。

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

ニース、それが正常に動作:)あなたは反対のaswellを持っていますか?私がD8を手に入れたように、-40 –