2014-05-07 37 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