web-dev-qa-db-ja.com

Swift数値を16進文字列として持つネイティブ関数

文字列で16進表現を取得するためのネイティブのSwift=少なくとも整数)の方法はありますか?逆も同様です。Foundationを使用しないでください。たとえば、Stringクラスには関数があります

func toInt() -> Int?

整数を表す文字列をInt値に変換します。 16進文字列を使用して、似たようなものを探しています。これは簡単に実装できることはわかっていますが、Swiftにすでにある場合は、それがより良いでしょう。そうでなければ、次を達成するためにStringとIntの拡張をすでに作成している場合:

let anHex = "0xA0"
if let anInt = anHex.toInt() {
   println(anInt)               // prints 128
   println(anInt.toHexString()) // prints "0xA0"
}

私はそれがロケット科学ではないことを知っていますが、万が一それを共有してください。

PS:これは この質問 に似ていますが、違いはFoundationフレームワークに非常に関連していたことですが、コードでは使用していません(また、他のものはインポートしていません)。また、学習目的のために、このように維持したいです。

40

Swift 2、現在、すべての整数型にはコンストラクタがあります

_init?(_ text: String, radix: Int = default)
_

整数から16進文字列への変換、および16進文字列から整数への変換の両方を組み込みメソッドで実行できます。例:

_let num = 1000
let str = String(num, radix: 16)
print(str) // "3e8"

if let num2 = Int(str, radix: 16) {
    print(num2) // 1000
}
_

(Swift 1::)の古い答え整数から16進数文字列への変換は、

_let hex = String(num, radix: 16)
_

(たとえば、 Swiftで10進数を2進数に変換する方法を参照してください )。これはフレームワークのインポートを必要とせず、2〜36の任意のベースで動作します。

16進文字列から整数への変換は、BSDライブラリ関数strtoul()(compare Swiftでバイナリを10進数に変換する方法? )あなたは_import Darwin_をいとわない。

そうでなければ(私の知る限り)組み込みのSwiftメソッドはありません。指定された基数に従って文字列を数値に変換する拡張機能があります。

_extension UInt {
    init?(_ string: String, radix: UInt) {
        let digits = "0123456789abcdefghijklmnopqrstuvwxyz"
        var result = UInt(0)
        for digit in string.lowercaseString {
            if let range = digits.rangeOfString(String(digit)) {
                let val = UInt(distance(digits.startIndex, range.startIndex))
                if val >= radix {
                    return nil
                }
                result = result * radix + val
            } else {
                return nil
            }
        }
        self = result
    }
}
_

例:

_let hexString = "A0"
if let num = UInt(hexString, radix: 16) {
    println(num)
} else {
    println("invalid input")
}
_
76
Martin R

更新:Xcode 7.2•Swift 2.1.1

extension String {
    var drop0xPrefix:          String { return hasPrefix("0x") ? String(characters.dropFirst(2)) : self }
    var drop0bPrefix:          String { return hasPrefix("0b") ? String(characters.dropFirst(2)) : self }
    var hexaToDecimal:            Int { return Int(drop0xPrefix, radix: 16) ?? 0 }
    var hexaToBinaryString:    String { return String(hexaToDecimal, radix: 2) }
    var decimalToHexaString:   String { return String(Int(self) ?? 0, radix: 16) }
    var decimalToBinaryString: String { return String(Int(self) ?? 0, radix: 2) }
    var binaryToDecimal:          Int { return Int(drop0bPrefix, radix: 2) ?? 0 }
    var binaryToHexaString:    String { return String(binaryToDecimal, radix: 16) }
}

extension Int {
    var toBinaryString: String { return String(self, radix: 2) }
    var toHexaString:   String { return String(self, radix: 16) }
}

テスト:

print("7fffffffffffffff".hexaToDecimal)      // "9223372036854775807" decimal integer
print("0x7fffffffffffffff".hexaToDecimal)    // "9223372036854775807" decimal integer
print("7fffffffffffffff".hexaToBinaryString) // "111111111111111111111111111111111111111111111111111111111111111" binary (String)
print("0x7fffffffffffffff".hexaToBinaryString) // "111111111111111111111111111111111111111111111111111111111111111"

print("255".decimalToHexaString)   // "ff"       hexa (String)
print("255".decimalToBinaryString) // "11111111" binary (String)
0b11111111

print("11111111".binaryToHexaString)      // "ff"  hexa (String)
print("0b11111111".binaryToHexaString)    // "ff"  hexa (String)
print("11111111".binaryToDecimal)         // 255 decimal (Int)
print("0b11111111".binaryToDecimal)       // 255 decimal (Int)

print(255.toBinaryString) // "11111111" binary (String)
print(255.toHexaString)   // "ff"       hexadecimal (String)
16
Leo Dabus

Swift

StringからUIntへ:

let str = "fcd7d7"
let number = UInt(str, radix: 16)!
print(number)

結果:16570327

UIntを16進数Stringに:

let number = UInt(exactly: 16570327)!
let str = String(number, radix: 16, uppercase: false)
print(str)

結果:fcd7d7

16
Ali Momen Sani

Floatの場合、IEEE754浮動小数点を16進数にしたい場合

extension Float {
 func floatToHex()->String {
    return String(self.bitPattern, radix: 16, uppercase: true)
 }
}
let f:Float = 3.685746e+19
let hex = f.floatToHex()

print("\(hex)")//5FFFC000

またはビザバーサ

extension String {

 func hexToFloat() -> Float {
    var toInt = Int32(truncatingBitPattern: strtol(self, nil, 16))
    var toInt = Int32(_truncatingBits: strtoul(self, nil, 16)) //For Swift 5
    var float:Float32!
    memcpy(&float, &toInt, MemoryLayout.size(ofValue: float))
    return float
 }
}
2
Kraming