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.
Câu trả lời:
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"
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
"0xF"sang a UInt?
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 :)
String(0xf, radix: 0x10, uppercase: false)
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.
String's init(_:radix:uppercase:)initializerSwift 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"
String's init(format:_:)initializerFoundationcung 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 Stringvà NSString. Trong số các chỉ định định dạng đó, %Xcó mô 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"
String's init(format:arguments:)initializerFoundationcung 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"
Để 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.
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)
Int("hexaString", radix: 16)
Swift 5.2.4
let value = 200
let hexString = String(format: "%02X", value)
String s = "0x" + String(n, radix: 16)