2010-12-20 20 views
20

Jak przekonwertować łańcuch na jego wartość bajtu? Mam ciąg "hello" i chcę go zmienić na coś takiego jak "/x68...".Jak przekonwertować ciąg na tablice bajtowe?

+2

Zdajesz sobie sprawę, że to wszystko to tylko bity i bajty u najniższy poziom i że ciągi '" hello "' i '" \ x68 \ x65 \ x6C \ x6C \ x6F "' są identyczne (chyba że uciekniesz przed ukośnikami odwrotnymi zamiast używać ich dla ucieczek heksadecymalnych)? – delnan

+0

Tak, wiem. Chcę tylko eksportować do pewnej tablicy na tak niskim poziomie. – Martin

+1

To nie ma sensu, co właściwie chcesz robić? (Jest to tylko pewien pośredni krok, który uważasz za konieczny). – plundra

Odpowiedz

31

Python 2.6 i nowsze wersje mają typ bytearray, który może być tym, czego szukasz. W przeciwieństwie do łańcuchów jest to zmienna, tzn. Można zmieniać poszczególne bajty "na miejscu", zamiast tworzyć cały nowy ciąg. Ma ładną mieszankę funkcji list i ciągów. I to również wyjaśnia, że ​​pracujesz z arbitralnymi bajtami, a nie z tekstem.

+1

quote "Chcę zmienić wszystko, co jest w pliku (String) w tablicy bajtów." ... odpowiedź @ kindall robi dokładnie to. +1 dla bytearray() – easysid

+8

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

+5

Zrobiłem kilka testów prędkości i 'list (bytearray (" hello "))' jest szybsze niż 'map (ord," hello ")' –

12

Jeśli chcesz uzyskać szesnastkową reprezentację ciąg można zrobić:

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

i spełniać swoją reprezentację odniesienia (nie brać tego na poważnie, że to jest nie to, czego naprawdę chcą) :

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

Może chcesz to (Python 2):

Przez ciąg Unicode to wróci Unicode punkty kodowe:

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

Ale kodują go uzyskać wartości bajtów do kodowania:

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

Należy zauważyć, że nie zwróci to wartości "bajtu" dla znaków spoza ASCII, ponieważ ord zwróci coś większego niż 0xFF. – user100464

+0

@ user100464, nie dla łańcucha bajtowego, który powyższy jest dla Pythona 2 ('map' nie zwraca listy w Pythonie 3). Bajt nie może być powyżej 0xFF. Również nie-ASCII jest powyżej 0x7F, a nie 0xFF :) –