Как преобразовать Int в Hex String в 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)
Чжао

Ответы:


139

Теперь вы можете:

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"

Шестнадцатеричные и десятичные числа меняются местами в "7B is 123 в шестнадцатеричном формате", поэтому выражение st следует исправить на: st = "(n) is" + String (format: "% 2X", n) + "in hex"
Кевин Слих

@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"в UInt?
Rich

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

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

@Rich Есть ли у нас этот метод счисления для NSString в Objective C?
Нареш Налламсетти

39

В Swift 5, в соответствии с вашими потребностями, вы можете выбрать один из трех следующих методов для решения вашей проблемы.


№1. Использование 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"

№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.

В приведенном ниже коде игровой площадки показано, как создать 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объект, инициализированный с использованием заданной строки формата в качестве шаблона, в который подставляются остальные значения аргументов в соответствии с локалью пользователя по умолчанию.

В приведенном ниже коде игровой площадки показано, как создать 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-разрядное целое число без знака (целое число без знака)

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.