Python de conversion de chaussette.recv à chaîne
Je suis à creuser autour de python et de réseautage.
while True:
data = sock.recv(10240)
C'est certainement à l'écoute. Mais il semble avoir besoin d'être converti en une chaîne de texte.
J'ai vu des personnes à l'aide de struct.unpack(), mais je ne suis pas sûr exactement comment il fonctionne.
Quelle est la façon de convertir?
Quelle est la version de python que vous utilisez? La réponse sera différente pour les 2.x et 3.x.
La Version 3.3.0 si je comprends bien, les 2.x est différent de 3.x dans certaines fonctionnalités de mise en réseau
Il n'est pas si différent que dans la mise en réseau des fonctionnalités—mais c'est assez différent dans le traitement de texte de fonctionnalités, ce qui est pourquoi Joshua D. Boyd posé la question.
La Version 3.3.0 si je comprends bien, les 2.x est différent de 3.x dans certaines fonctionnalités de mise en réseau
Il n'est pas si différent que dans la mise en réseau des fonctionnalités—mais c'est assez différent dans le traitement de texte de fonctionnalités, ce qui est pourquoi Joshua D. Boyd posé la question.
OriginalL'auteur coffeemonitor | 2012-12-20
Vous devez vous connecter pour publier un commentaire.
Ce que vous obtenez de retour de
recv
est unbytes
chaîne:En Python 3.x, pour convertir un
octets
chaîne de caractères dans un texte Unicodestr
chaîne, vous devez savoir de quel jeu de caractères de la chaîne est codé avec, de sorte que vous pouvez appelerdécoder
. Par exemple, si c'est de l'UTF-8:(En Python 2.x,
bytes
est la même chose questr
, de sorte que vous avez déjà ai une chaîne de caractères. Mais si vous voulez obtenir un texte Unicodeunicode
chaîne, c'est le même que dans le 3.x.)La raison pour laquelle les gens utilisent souvent
struct
est que les données n'est pas seulement de 8 bits ou de texte Unicode, mais un autre format. Par exemple, vous pouvez envoyer chaque message comme un "netstring": une longueur (comme une chaîne de caractères ASCII), suivie par une:
séparateur, puislength
octets en UTF-8, puis un,
—commeb"3:Abc,"
. (Il existe des variantes sur le format, mais c'est le Bernstein standard netstring.)La raison pour laquelle les gens utilisent netstrings, ou d'autres techniques similaires, c'est que vous devez trouver un moyen de délimiter les messages lorsque vous êtes en utilisant le protocole TCP. Chaque
recv
pourrait vous donner la moitié de ce que l'autre côté passé avecsend
, ou il pourrait donner à vos 3send
s et une partie de la 4e. Donc, vous devez accumuler un tampon derecv
de données, puis tirez sur le type de messages. Et vous avez besoin de savoir quand un message se termine et commence la suivante. Si vous êtes juste de l'envoi de messages au format texte brut, sans les retours à la ligne, vous pouvez simplement utiliser des retours à la ligne comme séparateur. Sinon, vous aurez à venir avec quelque chose d'autre—peut-être netstrings, ou à l'aide de\0
comme un séparateur, ou à l'aide de retours à la ligne comme séparateur, mais s'échappant de réels retours à la ligne dans les données, ou à l'aide de certains auto-délimités format structuré comme JSON.Exactement, si vous avez une chaîne de caractères, encoder et
send
les résultats.pourriez-vous l'esprit de partage exactement comment faire pour déterminer si un message se termine par un demi-codepoint (l'autre moitié étant dans le prochain message). Par exemple, si vous lisez à partir d'une prise, et vous savez qu'il va être en utf-8, comment pouvez-vous savoir quand les utiliser .decode() sur les octets lorsque vous ne savez pas si le dernier octet est utf-8 valide codepoint..
OriginalL'auteur abarnert
En Python 2.7.x et avant,
data
est déjà une chaîne de caractères. En Python 3.x,data
est un des octets de l'objet. POUR convertir les octets de la chaîne, utilisez ladecode()
méthode.decode()
nécessitera un codec argument, comme 'utf-8'.OriginalL'auteur Joshua D. Boyd