2014-05-07 53 views
1

我想将base64字符串转换回python中的GUID样式十六进制数并且出现问题。在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版本:

function GUIDToBase64($guid) { 
    $guid_b64 = ''; 
    $guid_parts = explode('-', $guid); 

    foreach ($guid_parts as $k => $part) { 
     if ($k < 3) 
     $part = join('', array_reverse(str_split($part, 2))); 

     $guid_b64 .= pack('H*', $part); 
    } 

    return base64_encode($guid_b64); 
    } 

这里有一些使用一些明显的和不那么明显的选择结果:

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

您是否尝试过?随意查看['base64'](https://docs.python.org/3.4/library/base64.html)。 – msvalkon

+0

是的,我已经尝试了大部分base64.b64解码选项等。让我更新结果 – Andrew

+0

好吧,你可以看到你的base64编码数据不符合你的期望。 – msvalkon

回答

1

现有功能的Python端口

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" 
+0

工作,非常感谢! – Andrew

1

首先,在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终端做:

import uuid 
import base64 

base64_guid = "bNVDIrkNbEySjZ90ypCLew==" 
bin_guid = base64.b64decode(base64_guid) 
guid = uuid.UUID(bytes=bin_guid) 
print guid 

此代码应该给你足够的提示,以建立自己的功能。不要忘记,python shell为您提供了一个强大的工具来测试代码和想法。我会调查使用类似IPython笔记本电脑。 (需要bitstring

+0

问题是我正在复制这个工作的另一个系统,例如输出从上面的PHP代码'php guid2b64.php 2243d56c-0db9-4c6c-928d-9f74ca908b7b' using'<?= Base64ToGUID(“bNVDIrkNbEySjZ90ypCLew ==”);?> – Andrew

+0

右边必须有某种形式的算法它正在使用。发布GUIDToBase64()函数。这显然不是对GUID的直接编码/解码。 – pobk