Привет всем,

Мне нужно преобразовать Int в его шестнадцатеричное значение. Пример: -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.

Кто-нибудь может помочь? Спасибо :)

3
Lucas Adam 25 Ноя 2016 в 17:19

2 ответа

Лучший ответ

Из вашего существующего кода я предполагаю, что все целые числа находятся в диапазоне -128 ... 127. Тогда это будет работать:

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

Формат "%02hhX" печатает младший байт задано целое число в базе 16 с двумя цифрами.

Примере:

print(encodeHex(data: [40, -40, 127, -128]))
// 28D87F80
4
Martin R 25 Ноя 2016 в 14:35

D8 - последний байт двоичного представления -40. Остальные три байта - это все FF.

Если вы ищете строку, представляющую только последний байт, вы можете получить ее, сначала преобразовав ваше число в 8-битное целое число без знака, а затем преобразовав его в шестнадцатеричное, например:

let x = UInt8(bitPattern:Int8(data))
let res = String(format:"%02X", x)
4
dasblinkenlight 25 Ноя 2016 в 14:32