【问题标题】:Remove the new line "\n" from base64 encoded strings in Python3?从 Python3 中的 base64 编码字符串中删除新行“\n”?
【发布时间】:2015-06-04 14:52:53
【问题描述】:

我正在尝试在 Python3 中建立 HTTPS 连接,当我尝试对我的用户名和密码进行编码时,base64 encodebytes 方法返回编码值,并在末尾带有换行符“\n”,因为我在尝试连接时遇到错误。

有没有办法告诉base64 库在编码时不要附加换行符,或者删除这个换行符的最佳方法是什么?我尝试使用replace 方法,但出现以下错误:

Traceback (most recent call last):
  File "data_consumer.py", line 33, in <module>
    auth_base64 = auth_base64.replace('\n', '')
TypeError: expected bytes, bytearray or buffer compatible object

我的代码:

auth = b'username@domain.com:passWORD'
auth_base64 = base64.encodebytes(auth)
auth_base64 = auth_base64.replace('\n', '')

有什么想法吗?谢谢

【问题讨论】:

    标签: python python-3.x base64


    【解决方案1】:

    考虑使用b64encode,而不是encodestring。后来不添加\n 字符。例如

    In [11]: auth = b'username@domain.com:passWORD'
    
    In [12]: base64.encodestring(auth)
    Out[12]: b'dXNlcm5hbWVAZG9tYWluLmNvbTpwYXNzV09SRA==\n'
    
    In [13]: base64.b64encode(auth)
    Out[13]: b'dXNlcm5hbWVAZG9tYWluLmNvbTpwYXNzV09SRA=='
    

    它产生相同的编码字符串,除了\n

    【讨论】:

    • @SevenDays base64.b64encode(auth) 适用于 python3 和 base64.standard_b64encode(auth) 似乎返回相同的结果。
    • 注意:在 Python 3 中,base64.standard_b64encode(s) 被定义为return b64encode(s),所以调用base64.b64encode(s) 就可以了。
    【解决方案2】:

    下面的代码可以工作

    auth_base64 = auth_base64.decode('utf-8').replace('\n', '')
    

    【讨论】:

      【解决方案3】:

      对于 Python 3 使用:

      binascii.b2a_base64(cipher_text, newline=False)
      

      对于 Python 2 使用:

      binascii.b2a_base64(cipher_text)[:-1]
      

      【讨论】:

      • 这个提示对我有用,在我的项目早期,我开始使用 base64 库,但遇到了在网页中嵌入编码图像和声音的各种问题,所以我切换到了运行良好的编解码器库,直到我尝试由于换行符而对字体进行编码。切换到 binascii 解决了所有这些问题。我在下面附上我的答案。
      【解决方案4】:

      我应用了@Harsh 提示,这两个函数对我的应用程序的二进制数据进行编码和解码。我的要求是能够在 HTML src 元素和 CSS @font-face 语句中使用数据 URI 来表示二进制对象,特别是图像、声音和字体。这些功能有效。

      import binascii
      
      def string_from_binary(binary): 
          return binascii.b2a_base64(binary, newline=False).decode('utf-8')
      
      def string_to_binary(string): 
          return binascii.a2b_base64(string.encode('utf-8'))
      

      【讨论】:

        【解决方案5】:

        我同意Mandar's observation 的观点,即base64.xxxx_encode() 将产生没有换行的输出\n

        对于那些想要更自信的理解而不仅仅是观察的人,这些是我可以在这个主题上找到的官方承诺(有点)。 Python 3 documentation 确实提到 base64.encode(...) 会在每 76 个字节的输出后添加换行符。与此相比,所有其他 *_encode(...) 函数根本没有提及它们的换行行为,这可以说是“无换行行为”。对于它的价值,Python 2 documentation 根本没有提到任何关于换行的事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多