【问题标题】:How to convert an Int to Hex String in Swift如何在 Swift 中将 Int 转换为十六进制字符串
【发布时间】:2014-08-05 10:34:43
【问题描述】:

在 Obj-C 中,我曾经使用

将无符号整数 n 转换为十六进制字符串
 NSString *st = [NSString stringWithFormat:@"%2X", n];

我尝试了很长时间将其翻译成 Swift 语言,但没有成功。

【问题讨论】:

标签: ios string hex swift


【解决方案1】:

斯威夫特 5.2.4

let value = 200
let hexString = String(format: "%02X", value)

【讨论】:

    【解决方案2】:

    使用 Swift 5,根据您的需要,您可以选择以下三种方法之一来解决您的问题。


    #1。使用 Stringinit(_:radix:uppercase:) 初始化器

    Swift String 有一个 init(_:radix:uppercase:) 初始化器,其声明如下:

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

    创建一个字符串,表示以 10 为基数的给定值,或其他一些指定的基数。

    下面的 Playground 代码展示了如何使用 init(_:radix:uppercase:) 创建一个以十六进制格式表示整数值的 String 实例,而无需导入 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。使用 Stringinit(format:​_:​) 初始化器

    Foundation 提供 String 一个 init(format:​_:​) 初始化程序。 init(format:​_:​) 有以下声明:

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

    返回一个String 对象,该对象使用给定的格式字符串作为模板进行初始化,其余参数值将被替换到该模板中。

    Apple 的字符串编程指南 提供了StringNSString 支持的格式说明符列表。在这些格式说明符中,%X 有以下description

    无符号 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。使用 Stringinit(format:​arguments:​) 初始化器

    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"
    

    【讨论】:

      【解决方案3】:

      您现在可以这样做:

      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 时才有效(这包括CocoaUIKit 的导入)。如果您在进行 iOSmacOS 编程,这不是问题。

      如果需要A...F,请使用大写X,如果需要a...f,请使用小写x

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

      如果要打印大于UInt32.max 的整数值,请将llel-el,而不是eleven)添加到格式字符串中:

      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)
      

      这使得st 成为NSString,所以像+= 这样的东西不起作用。如果您希望能够使用+=st 附加到字符串,则将String 像这样:

      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) is " + String(format:"%2X" ,n) + " 十六进制"
      • @KevinSliech,我承认这是模棱两可的。我的意思是,好像有人上前问“7B 代表什么?”,你会回答“7B 是用十六进制写的数字 123”。
      • 我觉得这两个都有点模棱两可,尤其是现在我已经阅读了大约 1000 次。另一种方法是写:“0x7B = 123d”或类似的东西。这种模棱两可可能会使不熟悉交替数字系统的人感到困惑。
      • @KevinSliech,谢谢。我把声明说得更清楚了。
      • 在 Swift4 中,如果您想在必要时以“0”开头,则必须使用“%02X”而不是“%2X”(“%2X”插入一个空格)
      【解决方案4】:

      上述答案适用于 32 位 Int 范围内的值,但超过此范围的值将不起作用,因为该值将翻转。

      对于大于 32 位 Int 的值,您需要使用 length modifier

      %x = 无符号 32 位整数(无符号整数)

      ll = 长度修饰符,指定后面的 d、o、u、x 或 X 转换说明符适用于 long long 或 unsigned long long 参数。

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

      【讨论】:

      • 请添加代码以将十六进制转换回十进制。
      • @VarunNaharia Int("hexaString", radix: 16)
      【解决方案5】:

      使用

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

      在 Swift3 中不需要导入基础,至少在项目中不需要。 String 应该具有 NSString 的所有功能。

      【讨论】:

        【解决方案6】:

        在 Swift 中,String 上有一个特定的 init 方法,用于此目的:

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

        【讨论】:

        • 如何将此字符串转换为 UInt?
        • 您想将"0xF" 转换为UInt
        • let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16), number 将是 UInt? 类型如果您需要更多提问:)
        • 可能:String(0xf, radix: 0x10, uppercase: false)
        • @Rich 我们在Objective C中有NSString的基数方法吗?
        猜你喜欢
        • 2011-01-17
        • 1970-01-01
        • 2013-02-07
        • 2020-12-09
        • 2020-07-18
        • 1970-01-01
        相关资源
        最近更新 更多