2014-05-07 5 views
1

J'essaie de convertir une chaîne base64 en un nombre hexadécimal de style GUID en python et ayant des problèmes.décodage base64 guid en python

chaîne encodée base64 est: bNVDIrkNbEySjZ90ypCLew==

Et je dois le remettre à: 2243d56c-0db9-4c6c-928d-9f74ca908b7b

Je peux le faire avec le code PHP suivant, mais ne peut pas fonctionner comment Tô en 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)) 
    )); 
    } 

Voici la version 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); 
    } 

Voici quelques-uns des résultats en utilisant certains des évidentes et pas si des options évidentes:

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

Avez-vous essayé? N'hésitez pas à regarder [base64] (https://docs.python.org/3.4/library/base64.html). – msvalkon

+0

Oui, j'ai essayé la plupart des options de base64.b64decode etc. Laissez-moi mettre à jour avec les résultats – Andrew

+0

Eh bien, vous pouvez voir que vos données codées en base64 ne correspondent pas à ce que vous attendez qu'il soit. – msvalkon

Répondre

1

Port Python de la fonction existante (bitstring nécessaire)

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

Cela fonctionne, merci beaucoup! – Andrew

1

Tout d'abord, la chaîne B64 et le GUID obtenu ne correspond pas si on décode correctement.

>>> 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 

La version encodée en base64 du GUID résultant que vous avez publié est incorrecte. Je ne suis pas sûr de comprendre la façon dont vous encodez le GUID en premier lieu.

Python a dans son arsenal tous les outils nécessaires pour que vous puissiez répondre à ce problème. Cependant, voici le grincement rugueux je l'ai fait dans un terminal python:

import uuid 
import base64 

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

Ce code devrait vous donner assez d'un indice pour construire vos propres fonctions. N'oubliez pas, le shell python vous donne un outil puissant pour tester et jouer avec du code et des idées. Je voudrais étudier en utilisant quelque chose comme IPython ordinateurs portables.

+0

Problème est que je suis en train de répliquer un autre système où cela fonctionne par exemple. sortie du code PHP ci-dessus 'php guid2b64.php 2243d56c-0db9-4c6c-928d-9f74ca908b7b' en utilisant' ' – Andrew

+0

Droit donc il doit y avoir une forme d'algorithme il utilise. Publiez la fonction GUIDToBase64(). Ce n'est clairement pas un encodage/décodage direct d'un GUID. – pobk