У 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)
Це робить , так то речі , як не працювати. Якщо ви хочете мати можливість додати до рядка за допомогою make, приблизно так:st
NSString
+=
+=
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 є конкретний init
метод String
для саме цього:
let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
"0xF"
в a UInt
?
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16)
, number
буде типу UInt?
Якщо вам потрібно більше задати питання :)
String(0xf, radix: 0x10, uppercase: false)
За допомогою 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"
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.
Код 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"
String
«s 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-бітове ціле число (беззнаковий int)
ll = Модифікатори довжини, що вказують, що наступний специфікатор перетворення d, o, u, x або X застосовується до аргументу long long або unsigned long long.
let hexString = String(format:"%llX", decimalValue)
Int("hexaString", radix: 16)
Свіфт 5.2.4
let value = 200
let hexString = String(format: "%02X", value)
String s = "0x" + String(n, radix: 16)