【问题标题】:Swift String and base64Encode ConfusionSwift String 和 base64Encode 混淆
【发布时间】:2019-11-23 09:46:13
【问题描述】:

我在编码数据时遇到问题。我的令牌有 1228 个字符和

let data = Data(base64Encoded: tokenString)! 

工作正常,但是当我向令牌添加一些信息并且我的令牌有 1263 个字符时,Data(base64Encoded:) 返回 nil。

我认为问题在于字符串长度或Data(base64Encoded:)

Data(base64Encoded:) 对字符长度有限制吗? 请给我一些关于这个问题的信息。

【问题讨论】:

  • 如何向令牌“添加一些信息”?如果您只是将另一个字符串附加到它,它可能不再是有效的 base64 字符串,因此Data(base64Encoded:) 将返回 nil。
  • 我使用 JWT 令牌并将一些数据添加到 PAYLOAD:DATA
  • 如果您共享显示令牌是什么以及您用于添加数据的代码的代码,也许会有所帮助。
  • 让 data = Data(base64Encoded: "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyMTF9")!工作正常,但让 data= Data(base64Encoded: "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyMX0")! return nil 问题在于字符串长度。 base64Encode 可能必须是多个 4。为什么?请告诉我或链接有关此问题的文章
  • 是的,可能是编码问题。太多的评论,所以即使编码失败的问题仍然悬而未决,所以作为答案发布:-)

标签: ios swift encode swift5


【解决方案1】:

不确定如何对修改后的令牌进行编码,但看起来编码后的 Base64 字符串不包含 padding 字符。将= 附加到修改后的令牌似乎可以解决解码问题:

// original token -> 57 bytes
let data1 = Data(base64Encoded: "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyMTF9")

// modified token -> nil
let data2 = Data(base64Encoded: "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyMX0")

// modified token with '=' for padding -> 56 bytes
let data2Fixed = Data(base64Encoded: "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyMX0=")

// decodes correctly: "{"sub":"1234567890","name":"John Doe","iat":15162390221}"
let string = String(data: data2Fixed!, encoding: .utf8)

所以要正确解决它,您可能需要查看编码器。希望对您有所帮助!

【讨论】:

  • 这个解决方案看起来并不优雅。还有其他的吗?
  • 如前所述,最好的选择是检查令牌如何编码为 Base64 以及为什么结果不包含填充。
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多