Aarrrgh l'esprit rechigne ....
@ S. Lott: « » « Je ne pense pas que le nombre est particulièrement important, étant donné que Python aura tendance à emballer correctement sans elle. » » "-1. Ne pense pas; enquêter. Sans un nombre signifie simplement que le nombre par défaut est de 1. Tends d'emballer correctement ???Peut-être que vous pensez que struct.pack("s", foo)
fonctionne de la même manière que "%s" % foo
? Ce n'est pas le cas; docs say "" "Pour le caractère de format 's', le nombre est interprété comme la taille de la chaîne, pas comme un nombre de répétitions comme pour les autres caractères de format, par exemple, '10s' une chaîne de 10 octets, ., tandis que « 10c » signifie 10 caractères d'emballage, la chaîne de caractères est tronqué ou rembourré avec des octets nuls, le cas échéant pour l'adapter « » »
@Brendan:. -1. value
n'est pas un tableau (quel qu'il soit); il est manifestement destiné à être une chaîne unicode ... regardez ici: value.encode("UTF8")
@Matt Ellen: La ligne de code que vous citez est sévèrement cassée. S'il y a des caractères non-ASCII dans value
, les données seront perdues.
Brisons-le:
`struct.pack("<ii%ds"%len(value), ParameterTypes.String, len(value), value.encode("UTF8"))`
Réduire l'espace de problème en supprimant le premier élément
struct.pack("<i%ds"%len(value), len(value), value.encode("UTF8"))
Maintenant, nous supposons que value
est u'\xff\xff'
, donc len(value)
est 2.
Let v8
= value.encode('UTF8')
, c'est-à-dire '\xc3\xbf\xc3\xbf'
.
Notez que len(v8)
est de 4. Est-ce que le penny baisse encore?
donc ce que nous avons maintenant est
struct.pack("<i2s", 2, v8)
Le numéro 2 est emballé comme 4 octets, 02 00 00 00
. La chaîne de 4 octets v8
est TRUNCATED (de la longueur 2 dans "2s") à la longueur deux. PERTE DE DONNÉES. ÉCHOUER.
La bonne façon de faire ce qui est sans doute voulu est:
v8 = value.encode('UTF8')
struct.pack("<ii%ds" % len(v8), ParameterTypes.String, len(v8), v8)
La déclaration est en soi ** BUGGY *. Vois ma réponse. Quelle bibliothèque? -) –
C'est une bibliothèque de fonctions écrites là où je travaille, pour traiter les messages envoyés sur un réseau. –