В 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 в следующее: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"
в 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)