在python中解码base64 guid

2024-09-28 22:30:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在python中将base64字符串转换回GUID样式的十六进制数,但遇到问题。在

Base64编码的字符串是:bNVDIrkNbEySjZ90ypCLew==

我要把它拿回来:2243d56c-0db9-4c6c-928d-9f74ca908b7b

我可以用下面的PHP代码来完成,但是不能用Python来实现

function Base64ToGUID($guid_b64) {
    $guid_bin = base64_decode($guid_b64);

    return join('-', array(
      bin2hex(strrev(substr($guid_bin, 0, 4))),
      bin2hex(strrev(substr($guid_bin, 4, 2))),
      bin2hex(strrev(substr($guid_bin, 6, 2))),
      bin2hex(substr($guid_bin, 8, 2)),
      bin2hex(substr($guid_bin, 10, 6))
    ));
  }

下面是GUIDtoBase64版本:

^{pr2}$

以下是使用一些明显的和不太明显的选项得出的一些结果:

import base64
import binascii
>>> base64.b64decode("bNVDIrkNbEySjZ90ypCLew==")
'l\xd5C"\xb9\rlL\x92\x8d\x9ft\xca\x90\x8b{'
>>> binascii.hexlify(base64.b64decode("bNVDIrkNbEySjZ90ypCLew=="))
'6cd54322b90d6c4c928d9f74ca908b7b'

Tags: 字符串importbin样式中将guidbase64b64
3条回答

我需要这样做来解码从Mongodb转储的BASE64 UUID。最初这块地是猫鼬创造的。基于@tpatja的代码,我使用的代码如下:

def base64ToGUID(b64str):
  try:
    bytes=base64.urlsafe_b64decode(b64str)
  except Exception as e:
    print("Can't decode base64 ", e)
  s = bitstring.BitArray(bytes).hex
  return "-".join([s[:8],s[8:][:4],s[12:][:4],s[16:][:4],s[20:]])

现有函数的Python端口(bitstring必需)

import bitstring, base64

def base64ToGUID(b64str):
  s = bitstring.BitArray(bytes=base64.b64decode(b64str)).hex
  def rev2(s_):
    def chunks(n):
      for i in xrange(0, len(s_), n):
          yield s_[i:i+n]
    return "".join(list(chunks(2))[::-1])
  return "-".join([rev2(s[:8]),rev2(s[8:][:4]),rev2(s[12:][:4]),s[16:][:4],s[20:]])

assert base64ToGUID("bNVDIrkNbEySjZ90ypCLew==") == "2243d56c-0db9-4c6c-928d-9f74ca908b7b"

首先,如果我们正确解码,b64字符串和生成的GUID不匹配。在

>>> import uuid
>>> import base64
>>> u = uuid.UUID("2243d56c-0db9-4c6c-928d-9f74ca908b7b")
>>> u
UUID('2243d56c-0db9-4c6c-928d-9f74ca908b7b')
>>> u.bytes
'"C\xd5l\r\xb9Ll\x92\x8d\x9ft\xca\x90\x8b{'
>>> base64.b64encode(u.bytes)
'IkPVbA25TGySjZ90ypCLew=='
>>> b = base64.b64decode('bNVDIrkNbEySjZ90ypCLew==')
>>> u2 = uuid.UUID(bytes=b)
>>> print u2
6cd54322-b90d-6c4c-928d-9f74ca908b7b

您发布的结果GUID的base64编码版本错误。我不确定我一开始不明白你对GUID的编码方式。在

所有的Python工具必须能够回答这个问题。不过,下面是我在python终端中所做的粗略描述:

^{pr2}$

这段代码应该给你足够的提示来构建你自己的函数。别忘了,pythonshell为您提供了一个强大的工具来测试和使用代码和思想。我会用笔记本之类的东西来研究。在

相关问题 更多 >