[ios] Swift에서 Int를 Hex String으로 변환하는 방법

Obj-C에서는 부호없는 정수 n을 다음과 같이 16 진수 문자열로 변환하는 데 사용했습니다.

 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 자보다 크면 필드 길이가 너비로 잘리지 않습니다 2. 전체 결과를 표시하는 데 필요한 길이로 확장됩니다.

Foundation가져온 경우에만 작동합니다 ( Cocoa또는 가져 오기 포함 UIKit). iOS 또는 macOS 프로그래밍을 수행하는 경우 문제가되지 않습니다 .

X원하는 경우 대문자를 사용 하고 원하는 경우 A...F소문자 를 사용하십시오 .xa...f

String(format: "%x %X", 64206, 64206)  // "face FACE"

보다 큰 정수 값을 인쇄 하려면 형식 문자열 UInt32.maxll( el-el , not eleven )을 추가하십시오.

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)

이 만드는 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


답변

Swift 5를 사용하면 필요에 따라 문제를 해결하기 위해 다음 세 가지 방법 중 하나를 선택할 수 있습니다.


#1. 사용 Stringinit(_: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:)하거나 사용 하지 않고 16 진수 형식의 정수 값을 나타내는 인스턴스 를 만드는 방법을 보여줍니다 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. 사용 Stringinit(format:​_:​)이니셜 라이저

Foundation이니셜 라이저를 제공 String합니다 init(format:​_:​). init(format:​_:​)다음과 같은 선언이 있습니다.

init(format: String, _ arguments: CVarArg...)

String주어진 형식 문자열을 템플릿으로 사용하여 초기화 된 개체를 반환 하고 나머지 인수 값을 대체합니다.

Apple의 String Programming GuideString및에서 지원하는 형식 지정자 목록을 제공합니다 NSString. 이러한 형식 지정자 중에는 %X다음과 같은 설명이 있습니다 .

부호없는 32 비트 정수 ( unsigned int), 숫자 0–9 및 대문자 A–F를 사용하여 16 진수로 인쇄됩니다.

아래 Playground 코드는 다음을 사용하여 String16 진수 형식의 정수 값을 나타내는 인스턴스 를 만드는 방법을 보여줍니다 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"

#삼. 사용 Stringinit(format:​arguments:​)이니셜 라이저

Foundation이니셜 라이저를 제공 String합니다 init(format:​arguments:​). init(format:​arguments:​)다음과 같은 선언이 있습니다.

init(format: String, arguments: [CVarArg])

String사용자의 기본 로케일에 따라 나머지 인수 값이 대체되는 템플릿으로 지정된 형식 문자열을 사용하여 초기화 된 개체를 반환합니다 .

아래 Playground 코드는 다음을 사용하여 String16 진수 형식의 정수 값을 나타내는 인스턴스 를 만드는 방법을 보여줍니다 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에서는 최소한 프로젝트에서는 필요하지 않습니다. String은 모든 기능을 NSString으로 가져야합니다.


답변

위의 답변은 32 비트 Int 범위의 값에 대해 잘 작동하지만이 값을 초과하는 값은 값이 롤오버되므로 작동하지 않습니다.

32 비트 Int보다 큰 값 에는 길이 수정자를 사용해야합니다.

% x = 부호없는 32 비트 정수 (부호없는 정수)

ll = 다음 d, o, u, x 또는 X 변환 지정자가 long long 또는 unsigned long long 인수에 적용되도록 지정하는 길이 수정 자입니다.

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


답변

스위프트 5.2.4

let value = 200
let hexString = String(format: "%02X", value)


답변