【问题标题】:int to string with base64 encoding on python 3.x and django-1.9在 python 3.x 和 django-1.9 上使用 base64 编码的 int 字符串
【发布时间】:2015-12-05 07:44:57
【问题描述】:

我使用 python 3.4 和 django-1.9。我需要 int 字符串和 base64 编码。

代码:

new_key = base64.b64encode(str(key))

错误:

Traceback (most recent call last):
  File "/home/mehmet/Envs/ets-3/lib/python3.4/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/mehmet/Envs/ets-3/lib/python3.4/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/mehmet/Envs/ets-3/lib/python3.4/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/mehmet/Envs/ets-3/lib/python3.4/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/mehmet/PycharmProjects/Tango/orders/views.py", line 167, in order_info
    subscribe_item_list, mount_subscribe_discount_relation)
  File "/usr/lib/python3.4/contextlib.py", line 30, in inner
    return func(*args, **kwds)
  File "/home/mehmet/PycharmProjects/Tango/operations/order.py", line 94, in new_order
    return encryption(order.id)
  File "/home/mehmet/PycharmProjects/Tango/operations/order.py", line 15, in encryption
    new_key = base64.b64encode(str(key))
  File "/home/mehmet/Envs/ets-3/lib/python3.4/base64.py", line 62, in b64encode
    encoded = binascii.b2a_base64(s)[:-1]
TypeError: 'str' does not support the buffer interface

【问题讨论】:

    标签: python python-3.x django-1.9


    【解决方案1】:

    在 Python 3 中,base64.b64encode 需要一个 bytes 对象作为其参数,而不是当前情况下的 str。您可以通过将key 中的整数转换为字节字符串,然后对字节字符串进行base64 编码来处理此问题:

    >>> key = 123456789
    >>> new_key = base64.b64encode(bytes(str(key), encoding='ascii'))
    >>> print(new_key)
    b'MTIzNDU2Nzg5'
    >>> key = -443322
    >>> new_key = base64.b64encode(bytes(str(key), encoding='ascii'))
    >>> print(new_key)
    b'LTQ0MzMyMg=='
    

    这里整数 key 首先被转换为 Python 3 字符串(str 类型),然后使用 ASCII 编码转换为字节字符串(bytes 类型)。可以使用任何有效的编码,但 ASCII 肯定会覆盖所有可能的数字和一元 -

    为了完整起见,在 Python 2 中您可以这样做:

    >>> key = 123456789
    >>> new_key = str(key).encode('base64')
    

    【讨论】:

    • 这个函数效率低下,它先将整数转换成字符串数组,然后进行base64转换。这里描述了一个更有效的解决方案:stackoverflow.com/a/68443789/234270
    猜你喜欢
    • 2019-09-27
    • 2012-07-07
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2013-10-17
    • 2022-12-05
    相关资源
    最近更新 更多