菜鸟教程小白 发表于 2022-12-13 05:40:17

ios - 解码 Base64 字符串返回 nil


                                            <p><p>我一直在尝试在我使用 swift 5 和 xcode 构建的应用程序中实现 GMAIL API。我已成功从用户那里检索到电子邮件,但我无法从编码字符串中获取实际文本。
每当我尝试将此 base64 编码数据转换为普通字符串时,它都会返回 nil。</p>

<p>这是字符串</p>

<pre><code>WW91ciBhY2NvdW50IHNhbG1hbm1hamlkMTRAZ21haWwuY29tIGlzIGxpc3RlZCBhcyB0aGUgcmVjb3ZlcnkgZW1haWwgZm9yDQpzaWRyYWlicmFoaW0wMzQ5QGdtYWlsLmNvbS4gRG9uJ3QgcmVjb2duaXplIHRoaXMgYWNjb3VudD8gQ2xpY2sgaGVyZQ0KPGh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9BY2NvdW50RGlzYXZvdz9hZHQ9QU9YOGtpcHBKRG5OX19KVGloejdoUHRnMlFwRHRRb3VETWVUalRMN2J4YjA3b2dJRC1xYm54QnZPRElTUjB3Q1h6RHlYQSZyZm49MTI3JmFuZXhwPWdpdmFiLWZhLS1tZHYyLWZhPg0KR29vZ2xlIEFQSXMgRXhwbG9yZXIgd2FzIGdyYW50ZWQgYWNjZXNzIHRvIHlvdXIgbGlua2VkIEdvb2dsZSBBY2NvdW50DQoNCg0Kc2lkcmFpYnJhaGltMDM0OUBnbWFpbC5jb20NCg0KSWYgeW91IGRpZCBub3QgZ3JhbnQgYWNjZXNzLCB5b3Ugc2hvdWxkIGNoZWNrIHRoaXMgYWN0aXZpdHkgYW5kIHNlY3VyZSB5b3VyDQphY2NvdW50Lg0KQ2hlY2sgYWN0aXZpdHkNCjxodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vQWNjb3VudENob29zZXI_RW1haWw9c2lkcmFpYnJhaGltMDM0OUBnbWFpbC5jb20mY29udGludWU9aHR0cHM6Ly9teWFjY291bnQuZ29vZ2xlLmNvbS9hbGVydC9udC8xNTY3ODQ3ODEyMDAwP3JmbiUzRDEyNyUyNnJmbmMlM0QxJTI2ZWlkJTNELTE1NzQzMDEyNjk4Mjg2MTM3OTQlMjZldCUzRDElMjZhbmV4cCUzRGdpdmFiLWZhLS1tZHYyLWZhPg0KWW91IHJlY2VpdmVkIHRoaXMgZW1haWwgdG8gbGV0IHlvdSBrbm93IGFib3V0IGltcG9ydGFudCBjaGFuZ2VzIHRvIHlvdXINCkdvb2dsZSBBY2NvdW50IGFuZCBzZXJ2aWNlcy4NCsKpIDIwMTkgR29vZ2xlIExMQywgMTYwMCBBbXBoaXRoZWF0cmUgUGFya3dheSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMsIFVTQQ0K
</code></pre>

<p>stackoverflow 上的一些答案建议向字符串添加填充,但这也不起作用。 </p>

<p>我已经尝试了这里所有的解决方案,但都没有奏效。我现在已经实现了这段代码。</p>

<pre class="lang-swift prettyprint-override"><code>extension String {

    func base64Encoded() -&gt; String? {
      return data(using: .utf8)?.base64EncodedString()
    }

    func base64Decoded() -&gt; String? {
      var st = self;
      print(st.count)
      let remainder = self.count % 4
      if remainder &gt; 0 {
            st = self.padding(toLength: self.count + 4 - remainder,
                                          withPad: &#34;=&#34;,
                                          startingAt: 0)
      }

      print(st.count)
      guard let d = Data(base64Encoded: st, options: .ignoreUnknownCharacters) else{
            return nil
      }
      return String(data: d, encoding: .utf8)
    }   
}
</code></pre>

<p>但这行不通。
如果有人能解决这个问题,我将不胜感激。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您的<em>字符串</em> 包含下划线字符('_' U+005F LOW LINE),它作为 Base-64 是无效的。</p>

<p>Base-64 有一些变体,因此您需要找到您的 Gmail 使用的是哪一个。 (维基百科 <a href="https://en.wikipedia.org/wiki/Base64" rel="noreferrer noopener nofollow">Base-64</a> .)</p>

<p>假设它使用 <em>base64url URL 和文件名安全</em>,您可能需要编写如下内容:</p>

<pre><code>extension String {
    func urlSafeBase64Decoded() -&gt; String? {
      var st = self
            .replacingOccurrences(of: &#34;_&#34;, with: &#34;/&#34;)
            .replacingOccurrences(of: &#34;-&#34;, with: &#34;+&#34;)
      let remainder = self.count % 4
      if remainder &gt; 0 {
            st = self.padding(toLength: self.count + 4 - remainder,
                              withPad: &#34;=&#34;,
                              startingAt: 0)
      }
      guard let d = Data(base64Encoded: st, options: .ignoreUnknownCharacters) else{
            return nil
      }
      return String(data: d, encoding: .utf8)
    }
}
</code></pre>

<p>例子:</p>

<pre><code>let base64 = &#34;WW91ciBhY2NvdW50IHNhbG1hbm1hamlkMTRAZ21haWwuY29tIGlzIGxpc3RlZCBhcyB0aGUgcmVjb3ZlcnkgZW1haWwgZm9yDQpzaWRyYWlicmFoaW0wMzQ5QGdtYWlsLmNvbS4gRG9uJ3QgcmVjb2duaXplIHRoaXMgYWNjb3VudD8gQ2xpY2sgaGVyZQ0KPGh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9BY2NvdW50RGlzYXZvdz9hZHQ9QU9YOGtpcHBKRG5OX19KVGloejdoUHRnMlFwRHRRb3VETWVUalRMN2J4YjA3b2dJRC1xYm54QnZPRElTUjB3Q1h6RHlYQSZyZm49MTI3JmFuZXhwPWdpdmFiLWZhLS1tZHYyLWZhPg0KR29vZ2xlIEFQSXMgRXhwbG9yZXIgd2FzIGdyYW50ZWQgYWNjZXNzIHRvIHlvdXIgbGlua2VkIEdvb2dsZSBBY2NvdW50DQoNCg0Kc2lkcmFpYnJhaGltMDM0OUBnbWFpbC5jb20NCg0KSWYgeW91IGRpZCBub3QgZ3JhbnQgYWNjZXNzLCB5b3Ugc2hvdWxkIGNoZWNrIHRoaXMgYWN0aXZpdHkgYW5kIHNlY3VyZSB5b3VyDQphY2NvdW50Lg0KQ2hlY2sgYWN0aXZpdHkNCjxodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vQWNjb3VudENob29zZXI_RW1haWw9c2lkcmFpYnJhaGltMDM0OUBnbWFpbC5jb20mY29udGludWU9aHR0cHM6Ly9teWFjY291bnQuZ29vZ2xlLmNvbS9hbGVydC9udC8xNTY3ODQ3ODEyMDAwP3JmbiUzRDEyNyUyNnJmbmMlM0QxJTI2ZWlkJTNELTE1NzQzMDEyNjk4Mjg2MTM3OTQlMjZldCUzRDElMjZhbmV4cCUzRGdpdmFiLWZhLS1tZHYyLWZhPg0KWW91IHJlY2VpdmVkIHRoaXMgZW1haWwgdG8gbGV0IHlvdSBrbm93IGFib3V0IGltcG9ydGFudCBjaGFuZ2VzIHRvIHlvdXINCkdvb2dsZSBBY2NvdW50IGFuZCBzZXJ2aWNlcy4NCsKpIDIwMTkgR29vZ2xlIExMQywgMTYwMCBBbXBoaXRoZWF0cmUgUGFya3dheSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMsIFVTQQ0K&#34;

print(base64.urlSafeBase64Decoded() ?? &#34;* decoding failed*&#34;)
</code></pre>

<p>输出:</p>

<pre><code>You received this email to let you know about important changes to your
Google Account and services.
© 2019 Google LLC, 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 解码 Base64 字符串返回 nil,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/57833744/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/57833744/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 解码 Base64 字符串返回 nil