有没有办法在Swift中将十六进制字符串转换为base64?例如,我想转换:
BA5E64C0DE
为:
ul5kwN4=
可以使用:
将普通字符串转换为base64let 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表示?
答案 0 :(得分:4)
base-64字符串"ul5kwN4="
转换为由五个字节NSData
,BA
,5E
,{{1}组成的二进制64
}和C0
。
现在,如果你真的有一个带十六进制表示的字符串,你可以使用类似这里的例程将它转换为二进制DE
:https://stackoverflow.com/a/26502285/1271826
获得NSData
后,您可以构建基本的64字符串:
NSData
生成所需的输出let hexString = "BA5E64C0DE"
let binaryData = hexString.dataFromHexadecimalString()
let base64String = binaryData?.base64EncodedStringWithOptions(nil)
。
答案 1 :(得分:2)
首先,使用以下例程将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)
}
}
}
然后,使用Data
将Base64 String
转换为Data.base64EncodedString(options:)
。
<强>用法强>
let base64 = "BA5E64C0DE".data(using: .bytesHexLiteral)?.base64EncodedString()
if let base64 = base64 {
print(base64)
// Prints "ul5kwN4="
}