2010-12-20 6 views
20

Comment puis-je convertir une chaîne à sa valeur d'octet? J'ai une chaîne "hello" et je veux changer est à quelque chose comme "/x68...".Comment convertir une chaîne en tableaux d'octets?

+2

vous vous rendez compte qu'il est tout juste bits et octets au le niveau le plus bas et que les chaînes '" hello "' et '" \ x68 \ x65 \ x6C \ x6C \ x6F "' sont identiques (à moins que vous n'échappiez les barres obliques inverses au lieu de les utiliser pour les échappements hexadécimaux)? – delnan

+0

Oui, je sais. Je veux juste exporter dans un tableau à un niveau aussi bas. – Martin

+1

Cela n'a aucun sens, qu'est-ce que vous _actually_ voulez faire? (Ceci est juste une étape intermédiaire que vous pensez que vous devez faire) – plundra

Répondre

31

Python 2.6 et versions ultérieures ont un type bytearray qui peut être ce que vous cherchez. Contrairement aux chaînes, il est modifiable, c'est-à-dire que vous pouvez modifier des octets individuels "en place" plutôt que d'avoir à créer une chaîne entière. Il a un bon mélange des caractéristiques des listes et des chaînes. Et cela rend également votre intention claire, que vous travaillez avec des octets arbitraires plutôt que du texte.

+1

Citation "Je veux changer tout ce qui est dans le fichier (String) en tableau byte." .. La réponse @ kindall fait exactement cela. +1 pour bytearray() – easysid

+8

'list (bytearray (" hello "))' –

+5

J'ai fait un test de vitesse et 'list (bytearray (" hello "))' est plus rapide que map (ord, "hello") ' –

12

Si vous souhaitez obtenir une représentation de chaîne hexadécimale que vous pourriez faire:

"hello".encode("hex") # '68656c6c6f' 

Et pour répondre à votre représentation de référence (ne le prenez pas au sérieux, devinez c'est pas ce que vous voulez vraiment) :

"".join(["/x%02x" % ord(c) for c in "hello"]) # '/x68/x65/x6c/x6c/x6f' 
27

peut-être que vous voulez que ce (Python 2):

Pour une chaîne Unicode ce rentreraient points de code Unicode:

>>> map(ord,u'Hello, 马克') 
[72, 101, 108, 108, 111, 44, 32, 39532, 20811] 

Mais encoder pour obtenir des valeurs d'octets pour le codage:

>>> map(ord,u'Hello, 马克'.encode('chinese')) 
[72, 101, 108, 108, 111, 44, 32, 194, 237, 191, 203] 
>>> map(ord,u'Hello, 马克'.encode('utf8')) 
[72, 101, 108, 108, 111, 44, 32, 233, 169, 172, 229, 133, 139] 
+0

Notez que cela ne retournera pas les valeurs "byte" pour les caractères non-ASCII, car ord renverra quelque chose de plus grand que 0xFF. – user100464

+0

@ user100464, pas pour une chaîne d'octets, comme ci-dessus pour Python 2 ('map' ne retourne pas une liste dans Python 3). Un octet ne peut pas être supérieur à 0xFF. En outre, non-ASCII est au-dessus de 0x7F, pas 0xFF :) –

Questions connexes