วิธีการแปลง Int เป็น Hex String ใน Swift


85

ใน Obj-C ฉันเคยแปลงจำนวนเต็ม n ที่ไม่ได้ลงนามเป็นสตริงฐานสิบหกด้วย

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

ฉันพยายามแปลสิ่งนี้เป็นภาษา Swift มานานแล้ว แต่ไม่สำเร็จ


จากคำตอบโดยstackoverflow.com/users/1187415/martin-r ที่นี่stackoverflow.com/questions/24986319/…คุณทำได้String s = "0x" + String(n, radix: 16)
Zhao

คำตอบ:


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; มันจะขยายเป็นความยาวเท่าใดก็ได้เพื่อแสดงผลลัพธ์แบบเต็ม

จะใช้ได้เฉพาะเมื่อคุณFoundationนำเข้า (ซึ่งรวมถึงการนำเข้าCocoaหรือUIKit) นี่ไม่ใช่ปัญหาหากคุณกำลังเขียนโปรแกรมiOSหรือmacOS

ใช้ตัวพิมพ์ใหญ่Xหากคุณต้องการA...Fและตัวพิมพ์เล็กxหากคุณต้องการa...f:

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

หากคุณต้องการพิมพ์ค่าจำนวนเต็มมากกว่าUInt32.maxให้เพิ่มll( el-elไม่ใช่สิบเอ็ด ) ลงในสตริงรูปแบบ:

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"

เลขฐานสิบหกและเลขฐานสิบจะกลับรายการใน "7B คือ 123 เป็นเลขฐานสิบหก" ดังนั้นจึงควรแก้ไขนิพจน์ st เป็น: st = "(n) คือ" + String (รูปแบบ: "% 2X", n) + "ในฐานสิบหก"
Kevin Sliech

@KevinSliech ฉันจะยอมรับว่ามันคลุมเครือ ฉันหมายความว่าเหมือนกับว่ามีคนมาถามว่า "7B หมายถึงอะไร" และคุณจะตอบว่า "7B คือตัวเลข 123 ที่เขียนด้วยเลขฐานสิบหก"
vacawama

ฉันพบว่าทั้งสองอย่างนั้นค่อนข้างคลุมเครือโดยเฉพาะตอนนี้ฉันอ่านทั้งคู่ ~ 1,000 ครั้ง อีกวิธีหนึ่งคือเขียน: "0x7B = 123d" หรืออะไรทำนองนั้น ความคลุมเครืออาจทำให้คนที่ไม่ค่อยมีความชำนาญในระบบตัวเลขอื่น
Kevin Sliech

@KevinSliech ขอบคุณ ฉันทำให้คำชี้แจงชัดเจนขึ้น
vacawama

1
ใน Swift4 คุณต้องใช้ "% 02X" แทน "% 2X" หากต้องการนำหน้า "0" ถ้าจำเป็น ("% 2X" ใส่ช่องว่าง)
Bubu

54

ใน Swift มีinitวิธีการเฉพาะStringสำหรับสิ่งนี้:

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

1
ฉันจะแปลง String นี้เป็น UInt ได้อย่างไร
TomSawyer

3
คุณต้องการแปลง"0xF"เป็นUInt?
รวย

1
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), numberจะเป็นชนิดUInt?หากคุณมากขึ้นจำเป็นต้องถามคำถาม :)
รวย

String(0xf, radix: 0x10, uppercase: false)
Mayhap

@ Rich เรามีวิธี radix นี้สำหรับ NSString ใน Objective C หรือไม่?
Naresh Nallamsetty

39

ด้วย Swift 5 ตามความต้องการของคุณคุณสามารถเลือกหนึ่งในสามวิธีต่อไปนี้เพื่อแก้ปัญหาของคุณ


# 1. ใช้ String's init(_:radix:uppercase:)initializer

Swift Stringมีinit(_:radix:uppercase:)initializer พร้อมคำประกาศต่อไปนี้:

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

สร้างสตริงที่แทนค่าที่กำหนดในฐาน 10 หรือฐานอื่นที่ระบุ

โค้ด Playground ด้านล่างแสดงวิธีสร้างStringอินสแตนซ์ที่แสดงค่าจำนวนเต็มในรูปแบบฐานสิบหกโดยใช้init(_:radix:uppercase:)และไม่ต้องนำเข้า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's init(format:​_:​)initializer

Foundationให้Stringตัวinit(format:​_:​)เริ่มต้น init(format:​_:​)มีประกาศดังต่อไปนี้:

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

ส่งคืนStringอ็อบเจ็กต์ที่เริ่มต้นโดยใช้สตริงรูปแบบที่กำหนดเป็นเทมเพลตซึ่งใช้แทนค่าอาร์กิวเมนต์ที่เหลือ

ของแอปเปิ้ลString โปรแกรมคู่มือให้รายการ specifiers รูปแบบที่ได้รับการสนับสนุนโดยและString NSStringในบรรดาตัวระบุรูปแบบ%Xมีคำอธิบายดังต่อไปนี้:

จำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อ ( unsigned int) พิมพ์ด้วยเลขฐานสิบหกโดยใช้ตัวเลข 0–9 และตัวพิมพ์ใหญ่ A – F

โค้ด Playground ด้านล่างแสดงวิธีสร้างStringอินสแตนซ์ที่แสดงค่าจำนวนเต็มในรูปแบบเลขฐานสิบหกด้วย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's init(format:​arguments:​)initializer

Foundationให้Stringตัวinit(format:​arguments:​)เริ่มต้น init(format:​arguments:​)มีประกาศดังต่อไปนี้:

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

ส่งคืนStringอ็อบเจ็กต์ที่เริ่มต้นโดยใช้สตริงรูปแบบที่กำหนดเป็นเทมเพลตซึ่งค่าอาร์กิวเมนต์ที่เหลือจะถูกแทนที่ตามโลแคลเริ่มต้นของผู้ใช้

โค้ด Playground ด้านล่างแสดงวิธีสร้างStringอินสแตนซ์ที่แสดงค่าจำนวนเต็มในรูปแบบเลขฐานสิบหกด้วย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


2

คำตอบข้างต้นใช้ได้ดีสำหรับค่าในช่วง 32 บิต Int แต่ค่าที่เกินนี้จะใช้ไม่ได้เนื่องจากค่าจะพลิกไป

คุณต้องใช้ตัวปรับความยาวสำหรับค่าที่มากกว่า 32 บิต Int

% x = จำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อ (int ไม่ได้ลงนาม)

ll = ตัวปรับความยาวที่ระบุว่าตัวระบุการแปลง d, o, u, x หรือ X ต่อไปนี้ใช้กับอาร์กิวเมนต์ long long ที่ยาวหรือไม่ได้ลงนาม

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

โปรดเพิ่มรหัสเพื่อแปลงฐานสิบหกกลับเป็นทศนิยมด้วย
Varun Naharia

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.