在 Swift 中转换十进制、二进制和十六进制
Posted
技术标签:
【中文标题】在 Swift 中转换十进制、二进制和十六进制【英文标题】:Convert between Decimal, Binary and Hexadecimal in Swift 【发布时间】:2016-08-26 06:34:22 【问题描述】:我想知道的是最有效的代码转换方式(在 swift 2 中):
十进制转二进制 二进制转十进制 十进制转十六进制 十六进制转十进制 二进制转十六进制 十六进制转二进制我已经有了实现这一目标的基本且冗长的方法,但我想找到一种更有效的方法。
【问题讨论】:
***.com/q/45667905/3908884 【参考方案1】:String
和 Int
都具有采用 radix
(基数)的初始化程序。结合这些,您可以实现所有转换:
// Decimal to binary
let d1 = 21
let b1 = String(d1, radix: 2)
print(b1) // "10101"
// Binary to decimal
let b2 = "10110"
let d2 = Int(b2, radix: 2)!
print(d2) // 22
// Decimal to hexadecimal
let d3 = 61
let h1 = String(d3, radix: 16)
print(h1) // "3d"
// Hexadecimal to decimal
let h2 = "a3"
let d4 = Int(h2, radix: 16)!
print(d4) // 163
// Binary to hexadecimal
let b3 = "10101011"
let h3 = String(Int(b3, radix: 2)!, radix: 16)
print(h3) // "ab"
// Hexadecimal to binary
let h4 = "face"
let b4 = String(Int(h4, radix: 16)!, radix: 2)
print(b4) // "1111101011001110"
【讨论】:
@vacawama,如果十六进制值为 32 个字符会怎样?我正在尝试将 32 char -database 生成的 GUID - 转换为 int .. @rustyMagnet,一个 32 个字符的十六进制值将表示一个 128 位整数。你会用它做什么? @rustyMagnet:您可能希望将其转换为 UUID,它是 Swift(和 Java)等效的 GUID。 您能否提供一个示例,将带符号的 Int(例如:-52)转换为二进制,然后是十六进制,请@vacawama @H4Hugo,String(UInt64(bitPattern: -52), radix: 2)
, String(UInt64(bitPattern: -52), radix: 16)
【参考方案2】:
Swift 转换器 2、8、10、16
一堆Int
和String
用来转换不同的系统。
Int
用于处理十进制String
用于其他类型
将系统的字符串表示转换为十进制,将十进制转换为字符串表示是安全的
String -> Int -> String
有样本
binary(2) - 0b
octal(8) - 0o
decimal(10)
hexadecimal(16) - 0x
extension Int
//From Decimal
//10 -> 2
func decToBinString() -> String
let result = createString(radix: 2)
return result
//10 -> 8
func decToOctString() -> String
// let result = decToOctStringFormat()
let result = createString(radix: 8)
return result
//10 -> 16
func decToHexString() -> String
// let result = decToHexStringFormat()
let result = createString(radix: 16)
return result
//10 -> 8
func decToOctStringFormat(minLength: Int = 0) -> String
return createString(minLength: minLength, system: "O")
//10 -> 16
func decToHexStringFormat(minLength: Int = 0) -> String
return createString(minLength: minLength, system: "X")
fileprivate func createString(radix: Int) -> String
return String(self, radix: radix, uppercase: true)
fileprivate func createString(minLength: Int = 0, system: String) -> String
//0 - fill empty space by 0
//minLength - min count of chars
//system - system number
return String(format:"%0\(minLength)\(system)", self)
extension String
//To Decimal
//2 -> 10
func binToDec() -> Int
return createInt(radix: 2)
//8 -> 10
func octToDec() -> Int
return createInt(radix: 8)
//16 -> 10
func hexToDec() -> Int
return createInt(radix: 16)
//Others
//2 -> 8
func binToOct() -> String
return self.binToDec().decToOctString()
//2 -> 16
func binToHex() -> String
return self.binToDec().decToHexString()
//8 -> 16
func octToHex() -> String
return self.octToDec().decToHexString()
//16 -> 8
func hexToOct() -> String
return self.hexToDec().decToOctString()
//16 -> 2
func hexToBin() -> String
return self.hexToDec().decToBinString()
//8 -> 2
func octToBin() -> String
return self.octToDec().decToBinString()
//Additional
//16 -> 2
func hexToBinStringFormat(minLength: Int = 0) -> String
return hexToBin().pad(minLength: minLength)
fileprivate func pad(minLength: Int) -> String
let padCount = minLength - self.count
guard padCount > 0 else
return self
return String(repeating: "0", count: padCount) + self
fileprivate func createInt(radix: Int) -> Int
return Int(self, radix: radix)!
测试:
func testConverter()
let decInt = 13511
let binStr = "11010011000111"
let octStr = "32307"
let hexStr = "34C7"
//From Decimal
//10 -> 2
XCTAssertEqual(binStr, decInt.decToBinString())
//10 -> 8
XCTAssertEqual(octStr, decInt.decToOctString())
//10 -> 16
XCTAssertEqual(hexStr, decInt.decToHexString())
//To Decimal
//2 -> 10
XCTAssertEqual(decInt, binStr.binToDec())
//8 -> 10
XCTAssertEqual(decInt, octStr.octToDec())
//16 -> 10
XCTAssertEqual(decInt, hexStr.hexToDec())
//Others
//2 -> 8
XCTAssertEqual(octStr, binStr.binToOct())
//2 -> 16
XCTAssertEqual(hexStr, binStr.binToHex())
//8 -> 16
XCTAssertEqual(hexStr, octStr.octToHex())
//16 -> 8
XCTAssertEqual(octStr, hexStr.hexToOct())
//16 -> 2
XCTAssertEqual(binStr, hexStr.hexToBin())
//8 -> 2
XCTAssertEqual(binStr, octStr.octToBin())
//String format feature
//10 -> 8
XCTAssertEqual("017", (15).decToOctStringFormat(minLength: 3))
//10 -> 16
XCTAssertEqual("00F", (15).decToHexStringFormat(minLength: 3))
//16 -> 2
XCTAssertEqual("0011010011000111", hexStr.hexToBinStringFormat(minLength: 16))
【讨论】:
【参考方案3】:从十进制到二进制
extension Int
//10 -> "2"
func decToBinString() -> String
return String(self, radix: 2, uppercase: true)
extension String
//"2" -> 10
func binToDec() -> Int
return Int(self, radix: 2)!
【讨论】:
强制解开字符串扩展是危险的,因为它可能会使应用程序崩溃,最好让方法返回一个可选的,这样它的调用者在编译时就知道它可能会失败,而不是得到一个运行时崩溃。以上是关于在 Swift 中转换十进制、二进制和十六进制的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 将String类型的数字转换成数字类型(支持十进制十六进制)
如何在 Swift 中将十六进制字符串转换为 CString?