web-dev-qa-db-fra.com

Convertir le dictionnaire en octets et inversement en python?

J'ai besoin d'envoyer la valeur de certaines variables entre deux machines et j'ai l'intention de le faire en utilisant des sockets. J'utilise l'algorithme de hachage md5 comme somme de contrôle pour les données que j'envoie pour m'assurer que les données sont correctement transmises. Pour exécuter l'algorithme de hachage md5, je dois convertir les données en octets. Je souhaite transmettre à la fois le nom de la variable et sa valeur. Comme j'ai beaucoup de variables, j'utilise un dictionnaire.

Je veux donc convertir quelque chose comme ça en octets?

variables = {'var1' : 0, 'var2' : 'some string', 'var1' : ['listitem1','listitem2',5]}

En d'autres termes, j'ai un dictionnaire avec beaucoup de types de données différents à l'intérieur, y compris des listes qui à leur tour contiennent plusieurs types de données différents et je veux les convertir en octets. Ensuite, sur la machine réceptrice, reconvertissez ces octets dans un dictionnaire.

J'ai essayé quelques méthodes différentes json est recommandé ici ( Convertir un python dict en chaîne et retour ) mais je ne peux pas créer de chaîne avec tant pis pour les octets.

22
user1205406

Cela devrait fonctionner:

s=json.dumps(variables)
variables2=json.loads(s)
assert(variables==variables2)
27
Robᵩ

Si vous avez besoin de convertir le dictionnaire en binaire, vous devez le convertir en chaîne (JSON) comme décrit dans la réponse précédente, alors vous pouvez le convertir en binaire.

Par exemple:

my_dict = {'key' : [1,2,3]}

import json
def dict_to_binary(the_dict):
    str = json.dumps(the_dict)
    binary = ' '.join(format(ord(letter), 'b') for letter in str)
    return binary


def binary_to_dict(the_binary):
    jsn = ''.join(chr(int(x, 2)) for x in the_binary.split())
    d = json.loads(jsn)  
    return d

bin = dict_to_binary(my_dict)
print bin

dct = binary_to_dict(bin)
print dct

donnera la sortie

1111011 100010 1101011 100010 111010 100000 1011011 110001 101100 100000 110010 101100 100000 110011 1011101 1111101

{u'key': [1, 2, 3]}
11
shshank