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


85

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

 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 자보다 크면 필드 길이가 너비로 잘리지 않습니다 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"

16 진수와 10 진수는 "7B는 16 진수로 123"에서 반전되므로 st 표현식은 다음과 같이 수정되어야합니다. st = "(n) is"+ String (format : "% 2X", n) + "in hex"
Kevin Sliech

@KevinSliech, 나는 그것이 모호하다는 것을 인정할 것입니다. 누군가가 와서 "7B는 무엇을 나타내는가?"라고 물으면 "7B는 16 진수로 쓰여진 숫자 123입니다"라고 대답하는 것처럼 의미했습니다.
vacawama

나는 두 가지 모두 약간 모호하다는 것을 알았습니다. 특히 이제는 두 가지를 모두 ~ 1000 번 읽었습니다. 또 다른 방법은 "0x7B = 123d"또는 이와 비슷한 것으로 작성하는 것입니다. 모호함은 대체 숫자 체계에 익숙하지 않은 사람들을 괴롭힐 수 있습니다.
Kevin Sliech

@KevinSliech, 감사합니다. 나는 진술을 더 명확하게했다.
vacawama

1
Swift4에서는 "% 2X"대신 "% 02X"를 사용해야합니다. 필요한 경우 선행 "0"을 원할 경우 ( "% 2X"공백 삽입)
Bubu

54

Swift에는 정확히 이에 대한 특정 init방법 String이 있습니다.

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

1
이 문자열을 UInt로 어떻게 변환 할 수 있습니까?
TomSawyer

3
당신은 변환 할 "0xF"A를 UInt?
Rich

1
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), number유형이 될 것입니다 UInt?더 필요한 경우 질문하십시오 :)
Rich

String(0xf, radix: 0x10, uppercase: false)
아마도

@Rich Objective C의 NSString에 대한 기수 메소드가 있습니까?
Naresh Nallamsetty 2019 년

39

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"

2

쓰다

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

Swift3에서는 최소한 프로젝트에서는 필요하지 않습니다. String은 모든 기능을 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)

16 진수를 다시 10 진수로 변환하는 코드를 추가하세요.
Varun Naharia

@VarunNahariaInt("hexaString", radix: 16)
Leo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.