В Obj-C я использовал для преобразования целого числа без знака n в шестнадцатеричную строку с
NSString *st = [NSString stringWithFormat:@"%2X", n];
Я долго пытался перевести это на язык Swift, но безуспешно.
В Obj-C я использовал для преобразования целого числа без знака n в шестнадцатеричную строку с
NSString *st = [NSString stringWithFormat:@"%2X", n];
Я долго пытался перевести это на язык Swift, но безуспешно.
Теперь вы можете сделать:
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"
В Swift для String
существует конкретный метод init
для String
:
let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
С Swift 5, в соответствии с вашими потребностями, вы можете выбрать один из трех следующих способов, чтобы решить вашу проблему.
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"
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"
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"
Чтобы использовать
let string2 = String(format:"%02X", 1)
print(string2) // prints: "01"
В Swift3 импорт не требуется, по крайней мере, не в проекте. Строка должна иметь всю функциональность как NSString.
Ответы выше работают отлично для значений в диапазоне 32-битного Int, но значения над этим не будут работать, когда значение перевернется.
Вам нужно использовать модификатор длины для значений, превышающих 32-битный Int
% x = Неподписанное 32-битовое целое (unsigned int)
ll = модификаторы длины, указывающие, что следующий спецификатор преобразования d, o, u, x или X применяется к длинному длинному или беззнаковому длинному аргументу.
let hexString = String(format:"%llX", decimalValue)