Làm thế nào để chuyển đổi một chuỗi Int sang Hex trong Swift


85

Trong Obj-C, tôi đã sử dụng để chuyển đổi một số nguyên không dấu n thành một chuỗi hex với

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

Tôi đã cố gắng dịch nó sang ngôn ngữ Swift trong một thời gian dài, nhưng không thành công.


Dựa trên câu trả lời của stackoverflow.com/users/1187415/martin-r đây stackoverflow.com/questions/24986319/... , bạn có thể làmString s = "0x" + String(n, radix: 16)
Zhao

Câu trả lời:


138

Bây giờ bạn có thể làm:

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

Lưu ý: Trong 2ví dụ này là chiều rộng trường và đại diện cho chiều dài tối thiểu mong muốn. Lệnh 0cho nó đệm kết quả với hàng đầu 0nếu cần. (Nếu không có 0, kết quả sẽ được đệm bằng các khoảng trắng ở đầu). Tất nhiên, nếu kết quả lớn hơn hai ký tự, chiều dài trường sẽ không được cắt bớt chiều rộng 2; nó sẽ mở rộng đến bất kỳ độ dài nào cần thiết để hiển thị kết quả đầy đủ.

Điều này chỉ hoạt động nếu bạn đã Foundationnhập (điều này bao gồm nhập Cocoahoặc UIKit). Đây không phải là vấn đề nếu bạn đang lập trình iOS hoặc macOS .

Sử dụng chữ hoa Xnếu bạn muốn A...Fvà chữ thường xnếu bạn muốn a...f:

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

Nếu bạn muốn in các giá trị số nguyên lớn hơn UInt32.max, hãy thêm ll( el-el , không phải mười một ) vào chuỗi định dạng:

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

Câu trả lời gốc

Bạn vẫn có thể sử dụng NSStringđể làm điều này. Định dạng là:

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

Điều này làm cho stmột NSString, vì vậy sau đó những thứ như +=không hoạt động. Nếu bạn muốn có thể nối vào chuỗi với +=make stthành một chuỗi Stringnhư thế này:

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

hoặc là

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

hoặc là

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

Sau đó, bạn có thể làm:

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"

Các số thập phân và thập phân được đảo ngược trong "7B là 123 trong hệ thập lục phân", do đó, biểu thức st phải được sửa thành: st = "(n) là" + Chuỗi (định dạng: "% 2X", n) + "trong hệ thập lục phân"
Kevin Sliech

@KevinSliech, tôi sẽ thừa nhận rằng nó không rõ ràng. Ý tôi là như thể ai đó đến và hỏi, "7B đại diện cho cái gì?", Và bạn sẽ trả lời "7B là số 123 được viết bằng hệ thập lục phân".
vacawama

Tôi thấy cả hai điều đó hơi mơ hồ, đặc biệt là bây giờ tôi đã đọc cả hai ~ 1000 lần. Một cách khác là viết: "0x7B = 123d" hoặc tương tự như vậy. Sự mơ hồ có thể làm mất lòng những người không thông thạo các hệ thống số thay thế.
Kevin Sliech

@KevinSliech, cảm ơn. Tôi đã tuyên bố rõ ràng hơn.
vacawama

1
Trong Swift4 bạn phải sử dụng "% 02X" thay vì "% 2X" nếu bạn muốn hàng đầu "0" nếu cần thiết ( "% 2X" chèn một khoảng trắng)
Bubu

54

Trong Swift, có một initphương pháp cụ thể về Stringchính xác điều này:

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

1
Làm cách nào để chuyển đổi Chuỗi này thành UInt?
TomSawyer

3
bạn muốn chuyển đổi "0xF"sang a UInt?
Phong phú

1
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), numbersẽ thuộc loại UInt?Nếu bạn cần thêm hãy đặt câu hỏi :)
Rich

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

@Rich Chúng ta có phương pháp cơ số này cho NSString trong Mục tiêu C không?
Naresh Nallamsetty

39

Với Swift 5, tùy theo nhu cầu của bạn, bạn có thể chọn một trong ba phương pháp sau để giải quyết vấn đề của mình.


# 1. Sử dụng String's init(_:radix:uppercase:)initializer

Swift Stringcó một trình init(_:radix:uppercase:)khởi tạo với khai báo sau:

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

Tạo một chuỗi đại diện cho giá trị đã cho trong cơ số 10 hoặc một số cơ sở được chỉ định khác.

Mã Playground dưới đây cho biết cách tạo một Stringphiên bản đại diện cho một giá trị số nguyên ở định dạng thập lục phân bằng cách sử dụng init(_:radix:uppercase:)và không cần phải nhập 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. Sử dụng String's init(format:​_:​)initializer

Foundationcung cấp Stringmột trình init(format:​_:​)khởi tạo. init(format:​_:​)có khai báo sau:

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

Trả về một Stringđối tượng được khởi tạo bằng cách sử dụng một chuỗi định dạng đã cho làm mẫu mà các giá trị đối số còn lại được thay thế.

Hướng dẫn lập trình chuỗi của Apple cung cấp danh sách các chỉ định định dạng được hỗ trợ bởi StringNSString. Trong số các chỉ định định dạng đó, %Xmô tả sau :

Số nguyên 32-bit không dấu ( unsigned int), được in dưới dạng thập lục phân sử dụng các chữ số 0-9 và chữ hoa A – F.

Mã Playground dưới đây cho biết cách tạo một Stringphiên bản đại diện cho một giá trị số nguyên ở định dạng thập lục phân với 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. Sử dụng String's init(format:​arguments:​)initializer

Foundationcung cấp Stringmột trình init(format:​arguments:​)khởi tạo. init(format:​arguments:​)có khai báo sau:

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

Trả về một Stringđối tượng được khởi tạo bằng cách sử dụng một chuỗi định dạng nhất định làm mẫu trong đó các giá trị đối số còn lại được thay thế theo ngôn ngữ mặc định của người dùng.

Mã Playground dưới đây cho biết cách tạo một Stringphiên bản đại diện cho một giá trị số nguyên ở định dạng thập lục phân với 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

Để sử dụng

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

Trong Swift3, không bắt buộc phải nhập nền tảng, ít nhất không phải trong một Dự án. Chuỗi phải có tất cả các chức năng như NSString.


1

Các câu trả lời ở trên phù hợp với các giá trị trong phạm vi của Int 32 bit, nhưng các giá trị trên giá trị này sẽ không hoạt động vì giá trị sẽ cuộn qua.

Bạn cần sử dụng công cụ sửa đổi độ dài cho các giá trị lớn hơn Int 32bit

% x = Số nguyên 32 bit không dấu (int không dấu)

ll = Các công cụ sửa đổi độ dài chỉ định rằng một công cụ chỉ định chuyển đổi d, o, u, x hoặc X sau đây áp dụng cho một đối số dài dài dài hoặc dài không dấu.

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

Vui lòng thêm mã để chuyển đổi hệ thập lục phân trở lại hệ thập phân.
Varun Naharia,

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

0

Swift 5.2.4

let value = 200
let hexString = String(format: "%02X", value)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.