Swift'de Int'i Hex String'e dönüştürme


85

Obj-C'de işaretsiz bir n tamsayısını onaltılık bir dizgeye dönüştürürdüm

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

Uzun süre bunu Swift diline çevirmeye çalıştım, ancak başarısız oldu.


Stackoverflow.com/users/1187415/martin-r tarafından verilen yanıta göre burada stackoverflow.com/questions/24986319/… , şunları yapabilirsinizString s = "0x" + String(n, radix: 16)
Zhao

Yanıtlar:


139

Şimdi yapabilirsiniz:

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

Not: 2Bu örnekteki alan genişliğidir ve istenen minimum uzunluğu temsil eder . 0Ped giden ve sonucu söyler 0'ın gerekirse. (Bu olmadan, 0sonuç baştaki boşluklarla doldurulur). Elbette, sonuç iki karakterden büyükse, alan uzunluğu şu genişliğe kırpılmayacaktır 2; tam sonucu görüntülemek için gerekli olan uzunlukta genişleyecektir.

Bu, yalnızca Foundationiçe aktarmanız durumunda çalışır (buna Cocoaveya içeriğinin içe aktarılması dahildir UIKit). Yaptığınızı, bu bir sorun değildir iOS veya MacOS programlama.

İsterseniz büyük harf X, isterseniz A...Fküçük harf xkullanın a...f:

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

Daha büyük tamsayı değerleri yazdırmak istiyorsanız , biçim dizesine ( el-el , on bir değil ) UInt32.maxekleyin :ll

let n = UInt64.max
print(String(format: "%llX is hexadecimal for \(n)", n))
FFFFFFFFFFFFFFFF is hexadecimal for 18446744073709551615

Orijinal Cevap

Bunu NSStringyapmak için hala kullanabilirsiniz . Biçim şu şekildedir:

var st = NSString(format:"%2X", n)

Bu kılan stbir NSStringo kadar sonra işler gibi, +=yaptığınız işi değil. Eğer +=make ile dizgeye böyle stbir ekleme yapabilmek istiyorsanız String:

var st = NSString(format:"%2X", n) as String

veya

var st = String(NSString(format:"%2X", n))

veya

var st: String = NSString(format:"%2X", n)

O zaman şunları yapabilirsiniz:

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"

Onaltılık ve ondalık sayılar "7B, onaltılık olarak 123'tür" de tersine çevrilir, bu nedenle st ifadesi şu şekilde düzeltilmelidir: st = "(n)" + Dize (biçim: "% 2X", n) + "onaltılı"
Kevin Sliech

@KevinSliech, belirsiz olduğunu itiraf edeceğim. Sanki birisi gelip "7B neyi temsil ediyor?" Diye sormuş ve "7B onaltılık olarak yazılmış 123 sayısıdır" diye cevap vermişsiniz gibi demek istedim.
vacawama

Her ikisini de biraz belirsiz buluyorum, özellikle şimdi ikisini de ~ 1000 kez okuduğuma göre. Başka bir yol da "0x7B = 123d" veya bunun gibi bir şey yazmak olabilir. Bu belirsizlik, alternatif sayı sistemlerinde çok bilgili olmayan insanları şaşkına çevirebilir.
Kevin Sliech

@KevinSliech, teşekkürler. İfadeyi daha net yaptım.
vacawama

1
Swift4'te "% 2X" yerine "% 02X" kullanmalısın, eğer gerekirse "0" önde olmak istiyorsan ("% 2X" boşluk ekle)
Bubu

54

Swift'de tam olarak bunun için özel bir inityöntem var String:

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

1
Bu dizeyi UInt'e nasıl dönüştürebilirim?
TomSawyer

3
"0xF"a dönüştürmek ister misin UInt?
Zengin

1
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), numbertipte olacak UInt?Daha fazlasına ihtiyacınız varsa bir soru sorun :)
Zengin

mayhap:String(0xf, radix: 0x10, uppercase: false)
Mazyod

@Rich Objective C'de NSString için bu radix yöntemimiz var mı?
Naresh Nallamsetty

39

Swift 5 ile ihtiyacınıza göre probleminizi çözmek için aşağıdaki üç yöntemden birini seçebilirsiniz.


# 1. String'Nin init(_:radix:uppercase:)başlatıcısını kullanma

Swift String, init(_:radix:uppercase:)aşağıdaki beyana sahip bir başlatıcıya sahiptir:

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

10 tabanında veya belirtilen başka bir temelde verilen değeri temsil eden bir dize oluşturur.

Aşağıdaki Oyun Alanı kodu String, kullanarak init(_:radix:uppercase:)ve içe aktarmak zorunda kalmadan onaltılık biçimde bir tamsayı değerini temsil eden bir örneğin nasıl oluşturulacağını gösterir 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. String'Nin init(format:​_:​)başlatıcısını kullanma

Foundationsağlayan Stringbir init(format:​_:​)başlatıcı. init(format:​_:​)aşağıdaki beyana sahiptir:

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

StringKalan bağımsız değişken değerlerinin yerine konulduğu bir şablon olarak belirli bir biçim dizesi kullanılarak başlatılan bir nesneyi döndürür .

Apple'ın Dize Programlama Kılavuzu , Stringve tarafından desteklenen biçim belirleyicilerinin bir listesini verir NSString. Bu biçim belirleyicileri arasında %Xaşağıdaki açıklama bulunur :

unsigned int0–9 rakamları ve A – F büyük harfleri kullanılarak onaltılık olarak yazdırılan işaretsiz 32 bit tam sayı ( ).

Aşağıdaki Playground kodu, aşağıdakilerle Stringonaltılık biçimde bir tamsayı değerini temsil eden bir örneğin nasıl oluşturulacağını gösterir 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. String'Nin init(format:​arguments:​)başlatıcısını kullanma

Foundationsağlayan Stringbir init(format:​arguments:​)başlatıcı. init(format:​arguments:​)aşağıdaki beyana sahiptir:

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

StringKalan bağımsız değişken değerlerinin kullanıcının varsayılan yerel ayarına göre değiştirildiği bir şablon olarak belirli bir biçim dizesi kullanılarak başlatılan bir nesneyi döndürür .

Aşağıdaki Playground kodu, aşağıdakilerle Stringonaltılık biçimde bir tamsayı değerini temsil eden bir örneğin nasıl oluşturulacağını gösterir 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

Kullanmak

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

Swift3'te ithalat temeli gerekli değildir, En azından bir Projede. Dize, NSString olarak tüm işlevlere sahip olmalıdır.


1

Yukarıdaki yanıtlar, 32 bitlik bir Int aralığındaki değerler için iyi çalışır, ancak bunun üzerindeki değerler, değer devredileceğinden çalışmaz.

32bit Int'den büyük değerler için uzunluk değiştiriciyi kullanmanız gerekir

% x = İşaretsiz 32 bit tam sayı (işaretsiz tamsayı)

ll = Aşağıdaki d, o, u, x veya X dönüşüm belirtecinin uzun uzun veya işaretsiz uzun uzun bir bağımsız değişken için geçerli olduğunu belirten uzunluk değiştiriciler.

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

Hex'i tekrar ondalık sayıya dönüştürmek için lütfen kod ekleyin.
Varun Naharia

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

0

Swift 5.2.4

let value = 200
let hexString = String(format: "%02X", value)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.