Bonjour,
J'ai un programme python qu utilise la fonction pack du module struct. Et j'aimerais avoir son équivalent en langage C.
Merci
Bonjour,
J'ai un programme python qu utilise la fonction pack du module struct. Et j'aimerais avoir son équivalent en langage C.
Merci
Que fait cette fonction ? Quel est le contexte ? Peux-tu décrire le cas d'application ?
Bonjour,
Merci pour ta réponse.
Je ne connais pas trop python, mais elle à l'air d'être utilisé pour "formater" des chaines de caractères.
Par exemple :où l est un entier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part x += pack("B",l & 0x7F)
A chaque fois qu'elle est utilisé, c'est pour des chaines de caractères.
Si j'en crois la documentation (2.7 ou 3.6), struct permet la conversion string <-> octets.
Ca ressemble terriblement à sprintf(output_buffer, "format", v1, v2, ...).struct.pack(fmt, v1, v2, ...) Return a string containing the values v1, v2, ... packed according to the given format. The arguments must match the values required by the format exactly
Ok, cette fonction produit une séquence d'octets qui peut être affectée à un enregistrement C défini avec l'arrangement correspondant. Il n'y a pas lieu d'y avoir d'équivalent puisque cette fonction est justement destinée à l'interopérabilité vers C. L'équivalent c'est une struct compatible avec le format décrit.
Je pose donc à nouveau la question :
C'est pour envoyer des requêtes dans un certain protocole à un serveur
Certes mais dans quel cadre, comment ça se passe ? Que cherches-tu à faire en C qui nécessite cette opération ? Où est le programme C ? Où est le script Python ? Comment doivent-ils communiquer ?
Voilà le script python que j'aimerais traduire en C :
Et la fonction getLenOf :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 TYPE_ENUM = 0 TYPE_STRING = 2 TYPE_BYTES = 2 protocolVersion = 0 source_id = "sender" destination_id = "receiver" server = "10.2.182.26" namespace = "urn:dial-multiscreen-org:service:dial:1" data = "{\"type\":\"GET CONNECTION\",\"origin\":{}}" lnData = getLenOf(data) socket = socket.socket() socket = ssl.wrap_socket(socket) socket.connect((server,1900)) msg = pack(">BBBB%dsBB%dsBB%dsBBB%ds%ds" % (len(source_id),len(destination_id),len(namespace),len(lnData),len(data)),getType(1,TYPE_ENUM),protocolVersion,getType(2,TYPE_STRING),len(source_id),source_id,getType(3,TYPE_STRING),len(destination_id),destination_id,getType(4,TYPE_STRING),len(namespace),namespace,getType(5,TYPE_ENUM),0,getType(6,TYPE_BYTES),lnData,data) msg = pack(">I%ds" % (len(msg)),len(msg),msg) socket.write(msg)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 def getLenOf(s): x = "" l = len(s) while(l > 0x7F): x += pack("B",l & 0x7F | 0x80) l >>= 7 x += pack("B",l & 0x7F) return x
Partager