2011-02-23 5 views
1

Je sais que si je le découvre ou si quelqu'un me le montre, ce sera un coup de tête. Avant de poster des questions, j'essaie pendant au moins trois heures et beaucoup de recherche. Il y a plusieurs indices qui sont proches, mais rien que j'ai adopté/essayé ne semble fonctionner.Convertir un tableau d'octets Java en un tableau d'octets Python

Je suis en train de prendre un byte [] de Java et de le transmettre via JSON (avec Gson) à un JSON python en utilisant Flask. Cet octet [] est stocké dans un objet python en tant que liste entière lorsqu'il est reçu, mais maintenant je dois l'envoyer à MySQLdb et le stocker comme un blob. Le contenu des données est une donnée de fichier binaire. Comment convertir une liste entière python [1,2, -3, -143 ....] en quelque chose que je peux stocker dans MySQL? J'ai essayé bytearray() et array.array(), mais ceux-ci s'étouffent quand j'accède à la liste directement à partir de l'objet et essayons de me convertir en une chaîne pour stocker MySQLdb.

Tous les liens ou astuces sont grandement appréciés.

Répondre

4

Vous pouvez le joindre dans un bytestring (juste une chaîne sous python 2.x). Le moyen le plus simple, sinon le plus efficace, consisterait simplement à modifier les données, puis à les convertir en caractères et à les joindre. Quelque chose comme:

data = [1,2,-3,-143, ...] 
binData = ''.join(map(lambda x: chr(x % 256), data)) 

binData = ''.join(map(lambda x: chr(x % 256), attach.attcoll)) 
    sql_stmt = """INSERT INTO attachments (attno,filename,fileextension,projNo,procNo,wpattachment) \ 
    VALUES ('%s','%s','%s','%s','%s','%s') ON DUPLICATE KEY UPDATE filename='%s',fileextension='%s'""" % (attach.attno,\ 
    attach.filename,attach.fileextension,attach.projNo,attach.procNo,binData,attach.filename,attach.fileextension) 

    try: 
     cursor.execute(sql_stmt) 
     conn.commit() 
     cursor.close() 
     conn.close() 
     return 'SUCCESS' 
    except MySQLdb.Error: 
     cursor.close() 
     conn.close() 
     print "My SQL cursor execute error." 
     return 'FAILURE' 
+0

C'est génial et plus facile que je ne le pensais. Des idées sur la façon de l'obtenir dans MySQL? – kirtcathey

+0

@kirtcathey J'ai rarement utilisé MySQL, et jamais depuis python, malheureusement non. – cobbal

0

Je trouve ''.join(map(lambda x: chr(x % 256), data)) être douloureusement lent (~ 4 minutes) pour mes données sur python 2.7.9, où un petit changement str(bytearray(map(lambda x: chr(x % 256), data))) seulement pris environ 10 secondes.

0
data = [1,2,-3,-143, ...] 
binData = bytearray([x % 256 for x in data]) 
+6

Veuillez fournir quelques explications pour accompagner votre code. – Trent

Questions connexes