ios - 解码 .utf8 可能不能在 swift 中正常工作吗?
问题描述
这是我的字符串扩展
extension String {
func base64Encoded() -> String? {
return data(using: .utf8)?.base64EncodedString()
}
func base64Decoded() -> String? {
guard let data = Data(base64Encoded: self) else { return nil }
return String(data: data, encoding: .utf8)
}
}
我尝试解码字符串
eyJhdWQiOiIxMjM0IiwiaWF0IjoxNTMwNTM3MzQxLCJleHAiOjE1MzA1NDA5NDEsImlzcyI6Imh0dHA6Ly82O1282Dcu2jgzL2E32ko2N2ciLCJzdWIiOiIwMUNGVjZaRjA3WkhKQ1FZQVRURDFOVkM0UCIsInJscyI6WyJjb2FjaC5kcml2ZXIiXX0
到
{
"aud": "1234",
"iat": 1530537341,
"exp": 1530540941,
"iss": "http://6;]��7.�83/a7�J67g",
"sub": "01CFV6ZF07ZHJCQYATTD1NVC4P",
"rls": [
"coach.driver"
]
}
但是我还没有实现它。关于这个主题最奇怪的事情,在在线编码解码转换器网站上,它被转换为真的。但很快,我不能这样做。
解决方案
你应该使用 URl 安全编码和解码
extension String {
//: ### Base64 encoding a string
func base64Encoded() -> String? {
if let data = self.data(using: .utf8) {
return data.base64URLEncodedString()
}
return nil
}
//: ### Base64 decoding a string
func base64Decoded() -> String? {
if let data = Data(base64URLEncoded: self) {
return String(data: data, encoding: .utf8)
}
return nil
}
}
extension Data {
init?(base64URLEncoded string: String) {
let base64Encoded = string
.replacingOccurrences(of: "_", with: "/")
.replacingOccurrences(of: "-", with: "+")
// iOS can't handle base64 encoding without padding. Add manually
let padLength = (4 - (base64Encoded.count % 4)) % 4
let base64EncodedWithPadding = base64Encoded + String(repeating: "=", count: padLength)
self.init(base64Encoded: base64EncodedWithPadding)
}
func base64URLEncodedString() -> String {
// use URL safe encoding and remove padding
return self.base64EncodedString()
.replacingOccurrences(of: "/", with: "_")
.replacingOccurrences(of: "+", with: "-")
.replacingOccurrences(of: "=", with: "")
}
}
推荐阅读
- opencv - 在 OpenCV DNN C++ 中加载冻结图
- python - 如何在manim的圆圈上绘制等距的点?
- javascript - Facebook 营销 API 仅返回 25 个结果/广告
- c++ - 如果我传递一个包含容器的容器,我该如何构建我的模板
- google-cloud-platform - 如何在 GKE 中使用更新的 CUDA 版本?
- r - 强制 ggraph 中 geom_node_text 中节点的标签重复
- javascript - 在for循环中let和var的不同输出?任何人都可以解释的原因是什么?提前致谢
- svn - 如何将单独的存储库作为项目移动到其他存储库
- excel - Excel 数据透视表 OLAP Cube - 多个小计
- flutter - 使用 GridView 对可扩展 ListView 进行代码优化