В 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«s , если это необходимо. (Без 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)
Это делает , так то вещи , как не работать. Если вы хотите иметь возможность добавлять к строке с помощью make в следующее:stNSString+=+=stString
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 для этого есть специальный initметод String:
let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
"0xF"в UInt?
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), numberбудет типа UInt?Если вам нужно еще задать вопрос :)
String(0xf, radix: 0x10, uppercase: false)
В Swift 5, в соответствии с вашими потребностями, вы можете выбрать один из трех следующих методов для решения вашей проблемы.
String«s init(_:radix:uppercase:)инициализаторуSwift Stringимеет init(_:radix:uppercase:)инициализатор со следующим объявлением:
init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger
Создает строку, представляющую заданное значение в базе 10 или какой-либо другой указанной базе.
В приведенном ниже коде игровой площадки показано, как создать 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"
String«s init(format:_:)инициализаторуFoundationобеспечивает Stringв init(format:_:)инициализатор. init(format:_:)имеет следующее объявление:
init(format: String, _ arguments: CVarArg...)
Возвращает
Stringобъект, инициализированный с использованием заданной строки формата в качестве шаблона, в который подставляются остальные значения аргументов.
Руководство Apple по программированию строк содержит список спецификаторов формата, которые поддерживаются Stringи NSString. Среди этих спецификаторов формата %Xесть следующее описание :
32-разрядное целое число без
unsigned intзнака ( ), напечатанное в шестнадцатеричном формате с использованием цифр 0–9 и прописных букв A – F.
В приведенном ниже коде игровой площадки показано, как создать 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"
String«s init(format:arguments:)инициализаторуFoundationобеспечивает Stringв init(format:arguments:)инициализатор. init(format:arguments:)имеет следующее объявление:
init(format: String, arguments: [CVarArg])
Возвращает
Stringобъект, инициализированный с использованием заданной строки формата в качестве шаблона, в который подставляются остальные значения аргументов в соответствии с локалью пользователя по умолчанию.
В приведенном ниже коде игровой площадки показано, как создать 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-разрядное целое число без знака (целое число без знака)
ll = Модификаторы длины, указывающие, что следующий спецификатор преобразования d, o, u, x или X применяется к аргументу long long или unsigned long long.
let hexString = String(format:"%llX", decimalValue)
Int("hexaString", radix: 16)
Swift 5.2.4
let value = 200
let hexString = String(format: "%02X", value)
String s = "0x" + String(n, radix: 16)