2008-11-28 5 views
4

J'ai une chaîne dont la longueur est un multiple de 8 qui contient seulement 0 et 1. Je veux convertir la chaîne dans un tableau d'octets approprié pour écrire dans un fichier. Par exemple, si j'ai la chaîne "0010011010011101", je veux obtenir le tableau d'octets [0x26, 0x9d], qui, lorsqu'il est écrit dans un fichier, donnera 0x269d comme contenu binaire (brut).Conversion d'une chaîne de 1 et de 0 en un tableau d'octets

Comment puis-je faire cela en Python?

+0

[0x26, 0x9d] n'est pas un tableau d'octets. C'est une liste de 2 entiers (qui sont, en interne, des valeurs signées de 4 octets). Voulez-vous dire des octets réels ou voulez-vous dire des entiers? S'il vous plaît clarifier votre question. –

+0

Comment écrire le résultat souhaité sous la forme d'un tableau d'octets et non d'un tableau int? –

+0

Une séquence d'octets pourrait être une chaîne ('& \ x9d') ou un tableau réel (array.array ('B', [0x26, 0x9d])). Beaucoup de gens disent "tableau" quand ils veulent dire liste, tuple ou une autre séquence (comme une chaîne de caractères). Ou ils pourraient signifier "tableau", qui est une bibliothèque séparée. –

Répondre

3
py> data = "0010011010011101" 
py> data = [data[8*i:8*(i+1)] for i in range(len(data)/8)] 
py> data 
['00100110', '10011101'] 
py> data = [int(i, 2) for i in data] 
py> data 
[38, 157] 
py> data = ''.join(chr(i) for i in data) 
py> data 
'&\x9d' 
+0

int ('0010011010011101', 2) est probablement suffisant pour ce que l'OP veut – hop

5

Vous pouvez faire quelque chose comme ceci:

>>> s = "0010011010011101" 
>>> [int(s[x:x+8], 2) for x in range(0, len(s), 8)] 
[38, 157] 
+0

Si j'écris ces entiers dans un fichier, vont-ils simplement utiliser jusqu'à l'octet qui est requis, ou prendront-ils la pleine taille d'un int (4 octets, je pense)? –

4

Votre question montre une suite d'entiers, mais dit « tableau d'octets » et dit également « lorsqu'il est écrit à déposer, donnera 0x269d comme contenu binaire (brut) ". Ce sont trois choses très différentes. Je pense que vous avez sur-spécifié. De vos différents commentaires, il semble que vous voulez seulement la sortie du fichier, et les autres descriptions n'étaient pas ce que vous vouliez.

Si vous voulez une séquence d'entiers, regardez la réponse de Greg Hewgill.

Si vous voulez une séquence d'octets (comme dans une chaîne) - qui peut être écrite dans un fichier - regardez la réponse de Martin v. Löwis.

Si vous voulez un tableau d'octets, vous devez le faire.

import array 
intList= [int(s[x:x+8], 2) for x in range(0, len(s), 8)] 
byteArray= array.array('B', intList) 
+0

La séquence d'octets est ce que je cherchais. Merci pour l'aide. –

Questions connexes