Problème avec Python analysant les octets anormaux du flux de données Socket (détails)

不言
Libérer: 2019-03-13 13:26:56
avant
2585 Les gens l'ont consulté

Le contenu de cet article concerne le problème de l'analyse par Python des octets anormaux du flux de données Socket (détails). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Lorsque python envoie des données via socket, les caractères anglais sont échappés et convertis en leurs caractères d'origine, qui occupent un octet (par exemple : s est transféré vers s), tandis que les caractères chinois nécessitent deux caractères après avoir été échappés. pour identifier un caractère chinois (par exemple : bell est x92x9f après échappement). Il n'y a pas de problème du côté de l'envoi, mais le problème se produit principalement sur le client socket. Parce que lorsque le client accepte le flux de données, il y a une limite d'octets pour chaque acceptation, et un caractère chinois sera accepté deux fois, ce qui entraînera le signalement d'une UnicodeDecodeError à chaque fois que le flux accepté est échappé dans un caractère.

Actuellement, il existe un flux de données :

bmsg = b'\xe5\x88\x86\n\xe9\x92\x9f' # 分\n钟
Copier après la connexion

Normalement accepté et échappé comme :

smsg = str(bmsg, 'utf-8')   #方式一 或 
smsg = bmsg.decode()  # 方式二 第一参数默认utf8,第二参数默认strict,还有 ignore (忽略)、 replace (替代=?)
Copier après la connexion

Si le flux de données reçu maintenant est

bmsg = b'\xe5\x88\x86\n\xe9\x92'    # \x9f 作为下次接受
Copier après la connexion

Comment éviter la sortie anormale du programme ? Deux méthodes de traitement :
1) Traitement de la perte de données
À ce moment, si le flux d'octets est échappé en utilisant la méthode d'acceptation normale, une exception UnicodeDecodeError se produira. Afin de ne pas signaler l'exception, nous utilisons la méthode. lors de l'échappement 2. Spécifiez le deuxième paramètre comme ignorer, comme suit :

smsg = bmsg.decode('utf-8', 'ignore') # 输出: 分\n  ,如果为 replace 则 \n 后为 ?
Copier après la connexion

2) Divisez le flux de données puis traitez-le
Généralement, le serveur socket se trouve lors de l'envoi de données, chaque flux de données est complet et sera envoyé avec la fin d'un caractère spécifique (tel que : n). Sur la base de la situation actuelle, chaque fois que nous recevons des données, nous les divisons selon ce caractère spécifique dans une liste qui enregistre un seul flux de données. Le premier flux de la liste peut être incomplet, alors fusionnez-le avec le dernier flux accepté dans un flux de données complet et échappez-le ; le flux du milieu est un flux de données qui peut être échappé normalement, le dernier flux est également incomplet, alors enregistrez-le ; , utilisé pour diviser le flux accepté la prochaine fois et répéter l'opération ci-dessus. Cela garantit que le programme ne se terminera pas anormalement et que l'intégrité des données est assurée. Le code approximatif est le suivant :
Acceptation des données :

La première fois qu'il accepte msg1 = b'xe5x88x86nxe9' # L'horloge est divisée en xe9 et x92x9f
La deuxième fois qu'il accepte msg2 = b'x92x9f_stonen'

init_msg = b'' # 初始化流
  while True:
    msg = soc.recv(128) # 接受数据
    init_msg += msg
    msg_arr = init_msg.split(b'\n') # 注意此处的 b'\n' ,因为被拆分的为bytes串,所以也要用bytes串来拆分
    init_msg += msg_arr[-1]
    msg_arr.remove(msg_arr[-1])
    for i in range(len(msg_arr)):
      string = msg_arr[i].decode('utf-8')
      print(string
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!