SwiftでIntを16進文字列に変換する方法


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)

回答:


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の必要に応じて。(がない0と、結果は先頭のスペースで埋められます)。もちろん、結果が2文字より大きい場合、フィールドの長さは次の幅にクリップされません。2;の。完全な結果を表示するために必要な長さに拡張されます。

これFoundationは、インポートした場合にのみ機能します(これには、Cocoaまたはのインポートが含まれますUIKit)。iOSまたはmacOSプログラミングを行っている場合、これは問題ではありません。

大文字使用Xしたい場合はA...F、小文字xしたい場合はa...f

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

より大きい整数値を出力する場合は、フォーマット文字列に(el-el11ではなく)をUInt32.max追加します。ll

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)

これによりst、が作成されるNSStringため、のようなものは機能+=しません。+=makeを使用して文字列に追加できるようにする場合は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"

「7Bは16進数で123です」では、16進数と10進数が逆になっているため、st式を次のように修正する必要があります。st= "(n)is" + String(format: "%2X"、n)+ "in hex"
Kevin Sliech 2016

@KevinSliech、あいまいであることを認めます。誰かがやって来て「7Bは何を表しているの?」と尋ねると、「7Bは16進数で書かれた123という数字です」と答えるような意味でした。
vacawama 2016

特に、両方を約1000回読んだ今では、どちらも少しあいまいです。別の方法は、「0x7B = 123d」などと書くことです。あいまいさは、代替番号システムに精通していない人々を台無しにする可能性があります。
Kevin Sliech 2016

@KevinSliech、ありがとう。私はその声明をより明確にした。
vacawama 2016

1
あなたは(スペース挿入「%2X」)、必要に応じて「0」をリードしたい場合Swift4では、代わりに「%2X」の「%02X」を使用する必要があります
ブブ

54

Swiftには、まさにこれのための特定のinit方法がありStringます。

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

1
この文字列をUIntに変換するにはどうすればよいですか?
TomSawyer 2015

3
あなたはに変換"0xF"したいUIntですか?
リッチ

1
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16)numberタイプになりUInt?ますさらに質問が必要な場合:)
リッチ

多分:String(0xf, radix: 0x10, uppercase: false)
Mazyod 2016

@Rich Objective CのNSStringにこの基数メソッドはありますか?
NareshNallamsetty19年

39

Swift 5では、必要に応じて、問題を解決するために次の3つの方法のいずれかを選択できます。


#1。Stringinit(_:radix:uppercase:)初期化子を使用 する

SwiftにStringinit(_:radix:uppercase:)、次の宣言を持つ初期化子があります。

init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger

基数10またはその他の指定された基数で指定された値を表す文字列を作成します。

以下のPlaygroundコードは、以下を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初期化子を提供Stringinit(format:​_:​)ます。init(format:​_:​)次の宣言があります。

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

String指定されたフォーマット文字列をテンプレートとして使用して初期化されたオブジェクトを返し、残りの引数値が代入されます。

Appleの文字列プログラミングガイドには、Stringおよびでサポートされている形式指定子のリストが記載されていNSStringます。それらのフォーマット指定子の中で%X、次の説明があります。

符号なし32ビット整数(unsigned int)。0〜9の数字と大文字のA〜Fを使用して16進数で出力されます。

以下のPlaygroundコードStringは、整数値を16進形式で表すインスタンスを次のように作成する方法を示しています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。Stringinit(format:​arguments:​)初期化子を使用する

Foundation初期化子を提供Stringinit(format:​arguments:​)ます。init(format:​arguments:​)次の宣言があります。

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

String指定されたフォーマット文字列をテンプレートとして使用して初期化されたオブジェクトを返します。このテンプレートには、ユーザーのデフォルトロケールに従って残りの引数値が代入されます。

以下のPlaygroundコードStringは、整数値を16進形式で表すインスタンスを次のように作成する方法を示しています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ビット整数より大きい値には長さ修飾子を使用する必要があります

%x =符号なし32ビット整数(unsigned int)

ll =次のd、o、u、x、またはX変換指定子がlonglongまたはunsignedlonglong引数に適用されることを指定する長さ修飾子。

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

16進数を10進数に戻すコードも追加してください。
Varun Naharia 2018

@VarunNahariaInt("hexaString", radix: 16)
レオDabus

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.