Як перетворити Int на шістнадцятковий рядок в Swift


85

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

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

Я довго намагався перекласти це мовою Swift, але безуспішно.


На основі відповіді stackoverflow.com/users/1187415/martin-r тут stackoverflow.com/questions/24986319/… , ви можете це зробитиString s = "0x" + String(n, radix: 16)
Чжао

Відповіді:


138

Тепер ви можете зробити:

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, приблизно так: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"

Шістнадцяткові та десяткові числа зворотні в "7B - 123 у шістнадцятковій", тому вираз st слід виправити на: st = "(n) є" + Рядок (формат: "% 2X", n) + "у шістнадцятковому"
Кевін Сліх

@KevinSliech, я визнаю, що це неоднозначно. Я мав на увазі це так, ніби хтось підійшов і запитав: "що являє собою 7B?", А ви відповісте "7B - це число 123, написане шістнадцятковою цифрою".
vacawama

Я вважаю, що обидва з них трохи неоднозначні, особливо зараз, коли я прочитав обидва ~ 1000 разів. Іншим способом було б написати: "0x7B = 123d" або щось подібне. Невизначеність може зіпсувати людей, які недостатньо знаються на альтернативних системах числення.
Кевін Сліх

@KevinSliech, дякую. Я зробив заяву чіткішою.
vacawama

1
У Swift4 ви повинні використовувати "% 02X" замість "% 2X", якщо за потреби потрібно вести "0" ("% 2X" вставити пробіл)
Бубу,

54

У Swift є конкретний initметод Stringдля саме цього:

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

1
Як я можу перетворити цей рядок на UInt?
TomSawyer

3
ви хочете конвертувати "0xF"в a UInt?
Багатий

1
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), numberбуде типу UInt?Якщо вам потрібно більше задати питання :)
Rich

mayhap:String(0xf, radix: 0x10, uppercase: false)
Mazyod

@Rich Чи є у нас цей метод radix для NSString в Objective C?
Нареш Налламсетті

39

За допомогою 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. Використання 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"

№3. Використання 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"

2

Використовувати

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

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


1

Наведені вище відповіді добре працюють для значень у діапазоні 32-бітового Int, але значення над цим не працюють, оскільки значення перекидається.

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

% x = Беззнакове 32-бітове ціле число (беззнаковий int)

ll = Модифікатори довжини, що вказують, що наступний специфікатор перетворення d, o, u, x або X застосовується до аргументу long long або unsigned long long.

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

Будь ласка, додайте код, щоб також перетворити шістнадцятковий код у десятковий.
Варун Нахарія

@VarunNahariaInt("hexaString", radix: 16)
Лео Дабус

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.