在Swift中将十六进制字符串转换为Base64

时间:2015-04-13 01:56:43

标签: ios swift hex base64

有没有办法在Swift中将十六进制字符串转换为base64?例如,我想转换:

BA5E64C0DE

为:

ul5kwN4=

可以使用:

将普通字符串转换为base64
let hex: String = "BA5E64C0DE"

let utf8str: NSData = hex.dataUsingEncoding(NSUTF8StringEncoding)!
let base64Encoded: NSString = utf8str.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))

let base64: String = (base64Encoded as String)

但这会产生以下结果:

QkE1RTY0QzBERQ==

因为它只是将十六进制视为普通的UTF-8字符串,而不是十六进制。

可以通过循环每六个十六进制字符并将其转换为四个相应的base64字符来正确地将其转换为base64,但这将是非常低效的,并且只是简单的愚蠢(需要 17,830,160 if语句):

if(hex == "000000"){base64+="AAAA"}
else if(hex == "000001"){base64+="AAAB"}
else if(hex == "000002"){base64+="AAAC"}
else if(hex == "BA5E64"){base64+="ul5k"}
//...

如果有这样的事情会很好:

let hex: String = "BA5E64C0DE"

let data: NSData = hex.dataUsingEncoding(NSHexadecimalEncoding)!
let base64Encoded: NSString = data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))

let base64: String = (base64Encoded as String)

但遗憾的是,没有NSHexadecimalEncoding。有没有有效的方法将十六进制字符串转换为它在Swift中的base64表示?

2 个答案:

答案 0 :(得分:4)

base-64字符串"ul5kwN4="转换为由五个字节NSDataBA5E,{{1}组成的二进制64 }和C0

现在,如果你真的有一个带十六进制表示的字符串,你可以使用类似这里的例程将它转换为二进制DEhttps://stackoverflow.com/a/26502285/1271826

获得NSData后,您可以构建基本的64字符串:

NSData

生成所需的输出let hexString = "BA5E64C0DE" let binaryData = hexString.dataFromHexadecimalString() let base64String = binaryData?.base64EncodedStringWithOptions(nil)

答案 1 :(得分:2)

  1. 首先,使用以下例程将Hex String转换为Data。 (使用 Swift 3.0.2

    extension String {
        /// Expanded encoding
        ///
        /// - bytesHexLiteral: Hex string of bytes
        /// - base64: Base64 string
        enum ExpandedEncoding {
            /// Hex string of bytes
            case bytesHexLiteral
            /// Base64 string
            case base64
        }
    
        /// Convert to `Data` with expanded encoding
        ///
        /// - Parameter encoding: Expanded encoding
        /// - Returns: data
        func data(using encoding: ExpandedEncoding) -> Data? {
            switch encoding {
            case .bytesHexLiteral:
                guard self.characters.count % 2 == 0 else { return nil }
                var data = Data()
                var byteLiteral = ""
                for (index, character) in self.characters.enumerated() {
                    if index % 2 == 0 {
                        byteLiteral = String(character)
                    } else {
                        byteLiteral.append(character)
                        guard let byte = UInt8(byteLiteral, radix: 16) else { return nil }
                        data.append(byte)
                    }
                }
                return data
            case .base64:
                return Data(base64Encoded: self)
            }
        }
    }
    
  2. 然后,使用DataBase64 String转换为Data.base64EncodedString(options:)

  3. <强>用法

    let base64 = "BA5E64C0DE".data(using: .bytesHexLiteral)?.base64EncodedString()
    if let base64 = base64 {
        print(base64)
        // Prints "ul5kwN4="
    }