【问题标题】:Convert Hexadecimal String to Base64 in Swift在 Swift 中将十六进制字符串转换为 Base64
【发布时间】:2015-04-13 01:56:43
【问题描述】:

有没有办法在 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 表示?

【问题讨论】:

  • 我以前见过这种投反对票的模式(问题和所有答案的迅速投反对票,但没有一个解释为什么),这很烦人。也许他们认为这与其他讨论都是重复的(尽管我认为它略有不同,即使它涉及到其他地方已经很好地涵盖的问题)。我不知道。不过,我回答你的问题了吗?

标签: ios swift hex base64


【解决方案1】:

base-64 字符串 "ul5kwN4=" 转换为由五个字节组成的二进制 NSData BA5E64C0DE

现在,如果您确实有一个十六进制表示的字符串,您可以使用如下例程将其转换为二进制 NSDatahttps://stackoverflow.com/a/26502285/1271826

一旦你有了NSData,你就可以构建你的base 64字符串:

let hexString = "BA5E64C0DE"
let binaryData = hexString.dataFromHexadecimalString()
let base64String = binaryData?.base64EncodedStringWithOptions(nil)

生成所需的输出,ul5kwN4=

【讨论】:

  • @Jojodmo 我注意到你改变了你的例子。我更改了我的实现并确认我得到了所需的 base64 字符串。
  • 谢谢,我可以让它工作了。我可以建议将完整代码添加到此答案而不是链接到另一个答案吗? (here's the code I used)
  • 是否可以将base 64转换为十六进制字符串
  • @BraneDullet - 只需反转该过程,从字符串 (developer.apple.com/reference/foundation/nsdata/1410081-init) 创建一个 Data/NSData,然后,如果您真的需要一个十六进制字符串表示,请使用 @ that other answer中的987654338@方法。
  • @CunchalRaj - Swift 3 版本位于链接的 Stack Overflow 问题的末尾。
【解决方案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. 然后,使用Data.base64EncodedString(options:)Data 转换为Base64 String


用法

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

【讨论】:

    猜你喜欢
    • 2018-03-01
    • 1970-01-01
    • 2018-08-20
    • 2014-12-17
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2011-06-09
    • 2015-08-17
    相关资源
    最近更新 更多