我有以下擴展名可以將 UUID 轉換為 base64 url?? 安全字串,反之亦然。我正在為base64UrlSafeString不回傳 utf8 字串而苦苦掙扎,因為底層資料是一個 UInt8 陣列。至少我認為這是問題所在,因為最后一行decodeBase64UrlSafeString()回傳 nil。有沒有一種安全的方法可以將 UUID 中的 16 個位元組轉換為Datautf8 編碼的物件?
let uuid = UUID(uuidString: "9823c260-4feb-11e9-990c-354fb53401ce")!
print(uuid.base64UrlSafeString) //mCPCYE_rEemZDDVPtTQBzg
print(UUID.decodeBase64UrlSafeString(uuid.base64UrlSafeString)) //nil
UUID 擴展名:
extension UUID {
var base64UrlSafeString: String {
var result = self.data.base64EncodedString()
result = result.replacingOccurrences(of: " ", with: "-")
result = result.replacingOccurrences(of: "/", with: "_")
result = result.replacingOccurrences(of: "=", with: "")
return result
}
var data: Data {
var result = Data()
result.append(uuid.0)
result.append(uuid.1)
result.append(uuid.2)
result.append(uuid.3)
result.append(uuid.4)
result.append(uuid.5)
result.append(uuid.6)
result.append(uuid.7)
result.append(uuid.8)
result.append(uuid.9)
result.append(uuid.10)
result.append(uuid.11)
result.append(uuid.12)
result.append(uuid.13)
result.append(uuid.14)
result.append(uuid.15)
return result
}
static func decodeBase64UrlSafeString(_ base_64_uuid: String ) -> String? {
var base_64_uuid = base_64_uuid
base_64_uuid = base_64_uuid.replacingOccurrences(of: "-", with: " ")
base_64_uuid = base_64_uuid.replacingOccurrences(of: "_", with: "/")
while base_64_uuid.count % 4 != 0 {
base_64_uuid = base_64_uuid.appending("=")
}
guard let data = Data(base64Encoded: base_64_uuid) else { return nil }
print("Got here") //code makes it here
return String(data: data, encoding: .utf8) //returns nil!
}
}
uj5u.com熱心網友回復:
UUID 資料不是有效的 utf8 編碼字串。您需要的是將資料轉換為 UUID,然后回傳 uuidString:
static func decodeBase64UrlSafeString(_ base_64_uuid: String) -> String? {
var base_64_uuid = base_64_uuid
.replacingOccurrences(of: "-", with: " ")
.replacingOccurrences(of: "_", with: "/")
while base_64_uuid.count % 4 != 0 { base_64_uuid = "=" }
guard let data = Data(base64Encoded: base_64_uuid), data.count == 16 else { return nil }
let uuid = data.withUnsafeBytes { $0.load(as: UUID.self) }
return uuid.uuidString
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/336452.html
