Подтвердить что ты не робот

Как преобразовать Int в шестнадцатеричную строку в Swift

В Obj-C я использовал для преобразования целого числа без знака n в шестнадцатеричную строку с

 NSString *st = [NSString stringWithFormat:@"%2X", n];

Я долго пытался перевести это на язык Swift, но безуспешно.

4b9b3361

Ответ 1

Теперь вы можете сделать:

let n = 14
var st = String(format:"%02X", n)
st += " is the hexadecimal representation of \(n)"
print(st)
0E is the hexadecimal representation of 14

Примечание. Значение 2 в этом примере представляет собой ширину поля и представляет собой минимальную желаемую длину. 0 говорит ему дополнить результат начальным 0 если необходимо. (Без 0 результат будет дополнен начальными пробелами). Конечно, если результат больше двух символов, длина поля не будет обрезана до ширины 2; он расширится до любой длины, необходимой для отображения полного результата.

Это работает только в том случае, если у вас импортирован Foundation (включая импорт Cocoa или UIKit). Это не проблема, если вы занимаетесь программированием на iOS или MacOS.

Используйте прописные буквы X если вы хотите A...F и строчные буквы x если вы хотите a...f:

String(format: "%x %X", 64206, 64206)  // "face FACE"

Если вы хотите напечатать целочисленные значения больше, чем UInt32.max, добавьте ll (el-el, а не одиннадцать) в строку формата:

let n = UInt64.max
print(String(format: "%llX is hexadecimal for \(n)", n))
FFFFFFFFFFFFFFFF is hexadecimal for 18446744073709551615

Оригинальный ответ

Вы все еще можете использовать NSString для этого. Формат такой:

var st = NSString(format:"%2X", n)

Это делает st NSString, поэтому такие вещи, как +=, не работают. Если вы хотите иметь возможность добавлять к строке с помощью += make st в String следующим образом:

var st = NSString(format:"%2X", n) as String

или же

var st = String(NSString(format:"%2X", n))

или же

var st: String = NSString(format:"%2X", n)

Тогда вы можете сделать:

let n = 123
var st = NSString(format:"%2X", n) as String
st += " is the hexadecimal representation of \(n)"
// "7B is the hexadecimal representation of 123"

Ответ 2

В Swift для String существует конкретный метод init для String:

let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f

Ответ 3

С Swift 5, в соответствии с вашими потребностями, вы можете выбрать один из трех следующих способов, чтобы решить вашу проблему.


# 1. Использование String init(_:radix:uppercase:) инициализатор

Swift String имеет init(_:radix:uppercase:) со следующим объявлением:

init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger

Создает строку, представляющую данное значение в базе 10 или в некоторой другой указанной базе.

Код Playground ниже показывает, как создать экземпляр String, представляющий целочисленное значение в шестнадцатеричном формате, с использованием init(_:radix:uppercase:) и без необходимости импорта Foundation:

let string1 = String(2, radix: 16)
print(string1) // prints: "2"

let string2 = String(211, radix: 16)
print(string2) // prints: "d3"

let string3 = String(211, radix: 16, uppercase: true)
print(string3) // prints: "D3"

# 2. Использование init(format:​_:​) String init(format:​_:​) :)

Foundation предоставляет String init(format:​_:​) :). init(format:​_:​) имеет следующее объявление:

init(format: String, _ arguments: CVarArg...)

Возвращает объект String инициализированный с использованием заданной строки формата в качестве шаблона, в который подставляются оставшиеся значения аргумента.

Руководство по программированию Apple String содержит список спецификаторов формата, поддерживаемых String и NSString. Среди этих спецификаторов формата %X имеет следующее описание:

32-разрядное целое число unsigned int (целое число unsigned int), напечатанное в шестнадцатеричном формате с использованием цифр 0–9 и прописных букв A – F.

Код Playground ниже показывает, как создать экземпляр String который представляет целочисленное значение в шестнадцатеричном формате с помощью init(format:​_:​):

import Foundation

let string1 = String(format:"%X", 2)
print(string1) // prints: "2"

let string2 = String(format:"%02X", 1)
print(string2) // prints: "01"

let string3 = String(format:"%02X", 211)
print(string3) // prints: "D3"

let string4 = String(format: "%02X, %02X, %02X", 12, 121, 255)
print(string4) // prints: "0C, 79, FF"

# 3. Использование init(format:​arguments:​) String init(format:​arguments:​) :)

Foundation предоставляет String init(format:​arguments:​) :). init(format:​arguments:​) имеет следующее объявление:

init(format: String, arguments: [CVarArg])

Возвращает объект String инициализированный с использованием заданной строки формата в качестве шаблона, в который подставляются оставшиеся значения аргумента в соответствии с языковым стандартом пользователя по умолчанию.

Код Playground ниже показывает, как создать экземпляр String, представляющий целочисленное значение в шестнадцатеричном формате с помощью init(format:​arguments:​):

import Foundation

let string1 = String(format:"%X", arguments: [2])
print(string1) // prints: "2"

let string2 = String(format:"%02X", arguments: [1])
print(string2) // prints: "01"

let string3 = String(format:"%02X",  arguments: [211])
print(string3) // prints: "D3"

let string4 = String(format: "%02X, %02X, %02X",  arguments: [12, 121, 255])
print(string4) // prints: "0C, 79, FF"

Ответ 4

Чтобы использовать

let string2 = String(format:"%02X", 1)
print(string2) // prints: "01"

В Swift3 импорт не требуется, по крайней мере, не в проекте. Строка должна иметь всю функциональность как NSString.

Ответ 5

Ответы выше работают отлично для значений в диапазоне 32-битного Int, но значения над этим не будут работать, когда значение перевернется.

Вам нужно использовать модификатор длины для значений, превышающих 32-битный Int

% x = Неподписанное 32-битовое целое (unsigned int)

ll = модификаторы длины, указывающие, что следующий спецификатор преобразования d, o, u, x или X применяется к длинному длинному или беззнаковому длинному аргументу.

let hexString = String(format:"%llX", decimalValue)