web-dev-qa-db-ja.com

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

Obj-Cでは、符号なし整数nを16進文字列に変換するために使用しました

 NSString *st = [NSString stringWithFormat:@"%2X", n];

これをSwift言語に翻訳しようと長い間試みましたが、失敗しました。

65
boscarol

次のことができます。

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

注:この例の2field widthであり、minimum長さが必要です。 0は、必要に応じて、結果の先頭に0を埋め込むように指示します。 (0がない場合、結果には先行スペースが埋め込まれます)。もちろん、結果が2文字を超える場合、フィールド長は2の幅にクリップされません。完全な結果を表示するために必要な長さに拡張されます。

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

A...Fが必要な場合は大文字のXを使用し、a...fが必要な場合は小文字のxを使用します。

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

UInt32.maxより大きい整数値を出力する場合は、llel-elではなく、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"
102
vacawama

Swiftには、特定のinitメソッドがStringにあり、まさにこれを実現します。

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

Swift 5では、ニーズに応じて、次の3つの方法のいずれかを選択して問題を解決できます。


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

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

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

10を底とする特定の値を表す文字列を作成します。

以下のPlaygroundコードは、init(_:radix:uppercase:)を使用し、Stringをインポートせずに、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 a init(format:​_:​) 初期化子を提供します。 init(format:​_:​)には次の宣言があります。

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

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

AppleのString Programming Guideは、StringおよびNSStringでサポートされているフォーマット指定子のリストを提供します。これらのフォーマット指定子の中で、%Xには次の 説明 があります。

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

以下のPlaygroundコードは、init(format:​_:​)を使用して16進形式の整数値を表すStringインスタンスを作成する方法を示しています。

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は、String a init(format:​arguments:​) 初期化子を提供します。 init(format:​arguments:​)には次の宣言があります。

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

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

以下のPlaygroundコードは、init(format:​arguments:​)を使用して16進形式の整数値を表すStringインスタンスを作成する方法を示しています。

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"
25
Imanou Petit

使用するには

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

Swift3では、少なくともプロジェクトではなく、インポートの基礎は必要ありません。文字列には、NSStringとしてのすべての機能が必要です。

2
Goodtime

上記の回答は、32ビットIntの範囲の値に対しては正常に機能しますが、これを超える値はロールオーバーするため機能しません。

32ビットIntより大きい値には 長さ修飾子 を使用する必要があります

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

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

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