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 2
ví 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 0
cho nó đệm kết quả với hàng đầu 0
nế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 đã Foundation
nhập (điều này bao gồm nhập Cocoa
hoặ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 X
nếu bạn muốn A...F
và chữ thường x
nế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 st
mộ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 st
thành một chuỗi String
như 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 init
phương pháp cụ thể về String
chí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)
, number
sẽ 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 String
có 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 String
phiê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:_:)
initializerFoundation
cung cấp String
mộ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 String
và NSString
. Trong số các chỉ định định dạng đó, %X
có 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 String
phiê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:)
initializerFoundation
cung cấp String
mộ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 String
phiê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)