Top 20

1 0x00h 680 pts
2 boris39 680 pts
3 thefinder 680 pts
4 neoxquick 661 pts
5 maf-ia 643 pts
6 eax 642 pts
7 Lucky92 641 pts
8 nikokks 600 pts
9 benito255 590 pts
10 mego 573 pts
11 madbat2 564 pts
12 plucth 547 pts
13 Mart 535 pts
14 rostale 534 pts
15 Stupefy 515 pts
16 lalba 515 pts
17 tehron 499 pts
18 LouisJ 486 pts
19 Kithyane 484 pts
20 egosum 459 pts

Classement complet

Shoutbox

8 Oct - 10:01 am

Salut nikokks Ce problème n'est pas évident en effet. Une manière de faire est de trouver les formes les plus simples, et de les "effacer" de l'image avant de chercher les formes plus complexes ;)

4 Oct - 11:56 am

Salut a tous =) , je bug sur le problème 28 (forme analysis). Quelqu'un aurait il une piste ?

29 Sep - 5:38 pm

Coucou oui, tu peux m'envoyer un mail si tu veux. Le plus simple, ce serait d'avoir un package pour python 3. J'ai essayé et ça n'a pas marché!

17 Sep - 11:51 am

Salut thefinder, ça faisait longtemps ! Oula ça en fait des problèmes :'( Le premier challenge ? La somme de deux nombres ?

23 Jul - 2:13 am

Coucou, j'ai essayé de reprendre avec python. J'ai plusieurs soucis. 1) Il faut rajouter headers={'Content-Type': 'application/x-www-form-urlencoded'} avec un requests.session(). 2) Je n'ai pas réponse du serveur si je soumet une réponse au premier challenge. J'essaye finir en python les 3 dernières épreuves qui me reste. :)

6 Nov - 8:17 am

Bonjour, un léger problème sur l'épreuve 10 : Une fois réussie, le champ "points earned" indique 72 au lieu de 7 En revanche sur le site le nombre de points comptabilisés est bien 7 Merci pour ce site génial !

21 Oct - 9:48 pm

Équation du challenge 52 corrigée, merci

16 Oct - 8:43 am

Bonjour, il y a aussi un problème d'affichage "invalid equation" dans le challenge 52. Merci

14 Oct - 8:57 pm

Barbapapou l'équation du challenge 29 a été corrigée

4 Oct - 10:30 am

Bonjour, il y a un problème avec l'affichage d'une équation dans le challenge 29

Connexion
Mot de passe oublié

Supportez nousx

Vous aimez µContest ?
Supportez nous en votant (fun et difficulté) pour µContest sur WeChall :)
Si vous ne l'avez pas encore fait, profitez-en pour lier votre compte
Wechall à µContest pour pouvoir voter !

Merci

Forum

You are not logged in.

#1 2018-09-11 10:46:22

D4mocl3s
New member
Registered: 2018-08-21
Posts: 5

Manipulation fichiers/données binaires (Python) [Résolu]

Bonjour,

Je sollicite votre aide car j'ai beau retourner les variables dans tous les sens, je sens qu'il y a quelque chose qui m'échappe. Comment exploiter les variables données dans les challenges de cette section ?

En effet, quand j'affiche la page web de l'épreuve avec les variables qui sont données, j'ai des caractères spéciaux... Je suppose que c'est normal, sauf que quand je copie à la souris la chaîne de caractères (sans le "valeur=" au début) dans un fichier .wav (pour le premier challenge), impossible de l'écouter avec n'importe quel lecteur.

De plus, pour tous les challenges j'ai mes propres fonctions (python) qui récupèrent le contenu des variables pour les mettre dans un dictionnaire, cela marche très bien pour les autres challenges, mais pour ce genre de variable, j'ai un encodage qui se fait par dessus.

J'aimerai donc avoir un petit éclaircissement sur l'exploitation de ces variables afin de pouvoir résoudre ces challenges smile

Last edited by D4mocl3s (2018-09-28 10:15:11)

Offline

#2 2018-09-20 16:26:36

Metatr0n
Administrator
Registered: 2011-04-24
Posts: 205

Re: Manipulation fichiers/données binaires (Python) [Résolu]

Bonjour D4mocl3s,

désolé pour le retard de réponse, j'étais en vacances à l'océan ! Je viens juste de rentrer je vais pouvoir regarder ta question d'ici à demain wink

Offline

#3 2018-09-21 10:07:47

D4mocl3s
New member
Registered: 2018-08-21
Posts: 5

Re: Manipulation fichiers/données binaires (Python) [Résolu]

Bonjour Metatr0n,

Pas de soucis smile Je précise que j'utilise le module requests pour récupérer le challenge si ça peut aiguiller.

Last edited by D4mocl3s (2018-09-21 13:28:24)

Offline

#4 2018-09-23 18:15:50

Metatr0n
Administrator
Registered: 2011-04-24
Posts: 205

Re: Manipulation fichiers/données binaires (Python) [Résolu]

Hello,

alors oui en fait si tu copies colles à la souris les caractères, ça ne peut pas marcher. En effet, le navigateur, quand il essaie d'afficher les données, il affiche les caractères TANT QU'il ne trouve pas le caractère nul, représenté par 0 en binaire. Or, comme on envoie des données binaires qui ne sont pas des caractères, tôt ou tard il va forcément y avoir un octet qui représente 0, et le navigateur va l'interpréter comme le caractère de fin de chaine.
Il n'affiche alors pas la suite.

Je suspecte que tu emploies la même méthode pour décoder les données avec tes fonctions python. En fait, c'est pour ça qu'on donne la taille de la donnée qui suit, c'est pour éviter d'avoir à rechercher un caractère particulier qui symboliserait la fin et qui pourrait se retrouver dans les données elles même.

Donc essaie d'utiliser notre lib python téléchargeable sur le site, ou alors de prendre en compte le fait que les données peuvent contenir le caractère nul, et donc utiliser l'information de la taille des données.

C'est valable pour toutes les épreuves qui présentent des données binaires, comme les images ou les fichiers son. On s'est un peu ratés la dessus, on regrette de ne pas avoir tout encodé en un fomat ascii, comme le base64, et il aurait été plus judicieux d'utiliser le json plutot qu'une syntaxe maison. Mais bon tout est toujours améliorable.

Offline

#5 2018-09-26 15:28:15

D4mocl3s
New member
Registered: 2018-08-21
Posts: 5

Re: Manipulation fichiers/données binaires (Python) [Résolu]

Désolé pour le retard, j'ai été pris par autre chose et j'ai voulu faire quelques tests de mon côté pour essayer de bien construire ma réponse.

Metartr0n

alors oui en fait si tu copies colles à la souris les caractères, ça ne peut pas marcher. En effet, le navigateur, quand il essaie d'afficher les données, il affiche les caractères TANT QU'il ne trouve pas le caractère nul, représenté par 0 en binaire. Or, comme on envoie des données binaires qui ne sont pas des caractères, tôt ou tard il va forcément y avoir un octet qui représente 0, et le navigateur va l'interpréter comme le caractère de fin de chaine.
Il n'affiche alors pas la suite.

D'accord, en effet je comprends mieux pourquoi le copier/coller ne fonctionne pas mais alors comme manipuler des données binaires. C'est vraiment là où j'ai beaucoup de mal à comprendre.

Voici mes fonctions (je suis en python 3.7), le code n'est pas des plus élégants mais elles ont le mérite de très bien fonctionner pour les autres challenges :

def récupérationChallenge(challengeID, username="...", password=hashlib.sha1(b'...').hexdigest(), contestlogin=1, version=2, page="/contest.php"):

    data = {"username": username,
            "password": password,
            "ID": challengeID,
            "contestlogin": contestlogin,
            "version": version}

    r = requests.post("http://www.microcontest.com/contests/" + str(challengeID) + page, data=data)

    data = {}

    data["PHPSESSID"] = {"Valeur": r.cookies.get_dict()['PHPSESSID']}

    r = r.text.replace("\n", "").replace("<br/>", "\n").split("\n")

    for numLigne, ligne in enumerate(r):

        # Si la ligne contient des crochets alors c'est le nom de la variable du challenge
        if "[" in ligne and "]" in ligne:

            positionsCaractères = []

            # Récupération des positions des crochets et stockage dans une liste
            positionsCaractères.append(ligne.index("[") + 1)
            positionsCaractères.append(ligne.index("]"))

            # Initialisation d'une clé contenant le nom d'une variable du challenge et déclaration d'un dictionnaire de dictionnaire
            data[ligne[positionsCaractères[0]:positionsCaractères[1]]] = dict()

        # Si le dictionnaire contient au moins une clé
        if len(data) > 0:

            if "Longueur=" in ligne:

                # Récupération de la position du début de la valeur
                positionsCaractères = ligne.index("=") + 1

                # Initialisation d'une clé et de sa valeur représentant un dictionnaire de la clé précédement initialisée
                data[list(data.keys())[-1]]["Longueur"] = int(ligne[positionsCaractères:])

            # Si la clé "Longueur" est la dernière clé du dictionnaire et que "Valeur=" est dans la ligne
            # Alors on récupère la valeur par rapport à la longueur présente dans le paramètre longueur
            if "Longueur" in data[list(data.keys())[-1]] and "Valeur=" in ligne:

                # Récupération de la position du début de la valeur
                positionsCaractères = ligne.index("=") + 1

                # Initialisation d'une clé et de sa valeur représentant un dictionnaire de la clé précédement initialisée
                data[list(data.keys())[-1]]["Valeur"] = ligne[positionsCaractères:positionsCaractères + data[list(data.keys())[-1]]["Longueur"]]

            # Si la clé "Longueur" n'est pas la dernière clé du dictionnaire et que "Valeur=" est dans la ligne
            # Alors on récupère la valeur sans se soucier de la longueur
            elif "Longueur" not in data[list(data.keys())[-1]] and "Valeur=" in ligne:

                positionsCaractères = ligne.index("=") + 1

                data[list(data.keys())[-1]]["Valeur"] = ligne[positionsCaractères:].replace("\n", "")

    with open("D:/Programmation/Python/MicroContest/Save_Challenge_" + str(challengeID), "wb") as mon_fichier:

        mon_pickler = pickle.Pickler(mon_fichier)
        mon_pickler.dump(data)

def récupérationDonnées(challengeID):

    with open("D:/Programmation/Python/MicroContest/Save_Challenge_" + str(challengeID), "rb") as mon_fichier:

        mon_depickler = pickle.Unpickler(mon_fichier)

        return mon_depickler.load()

récupérationChallenge(20)

data = récupérationDonnées(20)

Avec ce code, voilà ce que je peux obtenir lors de la récupération du challenge OCR I :

print(data)
'hex': {'Longueur': 555, 'Valeur': '89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 78 00 00 01 02 01 03 00 00 00 0f 64 81 82 00 00 00 06 50 4c 54 45 07 cd 0a 04 e8 31 06 2a 94 7b 00 00 00 09 70 48 59 73 00 00 0e
c4 00 00 0e c4 01 95 2b 0e 1b 00 00 00 59 49 44 41 54 58 85 63 60 18 05 a3 60 14 8c 82 51 30 0a 46 c1 28 18 05 a3 60 14 8c 82 51 40 3f 90 80 ca fd 93 c0 7e bc 01 89 6f c0 c0 96 73 00 99 ff d8 2c e7 be 31 12 3f d9 fc cc cd cd c8 7c b3 1c 34 7e 1e 1a 3f 17 99 ff f7 e7 f7 e3 33 e7 a3 ba e1 00 c3 28 18 05 0c 00 70 17 18 48 21 ce b5 4b 00 00 00 00 49 45 4e 44 ae 42 60 82 '}, 'img': {'Longueur': 185, 'Valeur': 'PNG\r\x1a\x00\x00\x00\rIHDR\x00\x00\x00x\x00\x00\x01\x02\x01\x03\x00\x00\x00\x0fd\x00\x00\x00\x06PLTE\x07\x041\x06*{\x00\x00\x00\tpHYs\x00\x00\x0e\x00\x00\x0e\x01+\x0e\x1b\x00\x00\x00YIDATXc`\x18\x05`\x14Q0F(\x18\x05`\x14Q@?~\x01os\x00,1\x12?|\x1c4~\x1e\x1a?\x173磺\x00(\x18\x05\x0c\x00p\x17\x18H!εK\x00\x00\x00\x00IENDB`'}}
print(data['img']['Valeur])
IHDR   x  ╔╗╔╚   d   ═PLTE╝1═*{           pHYs    ╔+?   YIDATXc`║`Q0F(║`Q@?~╔os ,1?|4~?
3磺 (║
              pH!εK    IENDB`

Qu'elles formes de données dois-je utiliser pour construire une image PNG ?

Je suis parti sur le principe qu'il faut du binaire :

hexStr = data['hex']['Valeur'][:-1].split(' ')

for i, élément in enumerate(hexStr):

    hexStr[i] = int(élément, 16)

print(' '.join(map(lambda x: format(x, 'b'), hexStr)))
10001001 1010000 1001110 1000111 1101 1010 11010 1010 0 0 0 1101 1001001 1001000 1000100 1010010 0 0 0 1111000 0 0 1 10 1 11 0 0 0 1111 1100100 10000001 10000010 0 0 0 110 1010000 1001100 1010100 1000101 111 11001101 1010 100 11101000 110001 110 101010 10010100 1111011 0 0 0 1001 1110000 1001000 1011001 1110011 0 0 1110 11000100 0 0 1110 11000100 1 10010101 101011 1110 11011 0 0 0 1011001 1001001 1000100 1000001 1010100 1011000 10000101 1100011 1100000 11000 101 10100011 1100000 10100 10001100 10000010 1010001 110000 1010 1000110 11000001 101000 11000 101 10100011 1100000 10100 10001100 10000010 1010001 1000000 111111 10010000 10000000 11001010 11111101 10010011 11000000 1111110 10111100 1 10001001 1101111 11000000 11000000 10010110 1110011 0 10011001 11111111 11011000 101100 11100111 10111110 110001 10010 111111 11011001
11111100 11001100 11001101 11001101 11001000 1111100 10110011 11100 110100 1111110 11110 11010 111111 10111 10011001 11111111 11110111 11100111 11110111 11100011 110011 11100111 10100011 10111010 11100001 0 11000011 101000 11000 101 1100 0 1110000 10111 11000 1001000 100001 11001110 10110101 1001011 0 0 0 0 1001001 1000101 1001110 1000100 10101110 1000010 1100000 10000010

Mais en comparant avec la valeur de la variable img, je n'ai pas du tout les mêmes données binaires (qui je suppose varie à cause de l'encodage) :

print(' '.join(map(lambda x: format(x, 'b'), bytearray(data['img']['Valeur'], 'utf-8'))))
11101111 10111111 10111101 1010000 1001110 1000111 1101 11010 0 0 0 1101 1001001 1001000 1000100 1010010 0 0 0 1111000 0 0 1 10 1 11 0 0 0
1111 1100100 11101111 10111111 10111101 11101111 10111111 10111101 0 0 0 110 1010000 1001100 1010100 1000101 111 11101111 10111111 10111101 100 11101111 10111111 10111101 110001 110 101010 11101111 10111111 10111101 1111011 0 0 0 1001 1110000 1001000 1011001 1110011 0 0 1110 11101111 10111111 10111101 0 0 1110 11101111 10111111 10111101 1 11101111 10111111 10111101 101011 1110 11011 0 0 0 1011001 1001001 1000100 1000001 1010100 1011000 11101111 10111111 10111101 1100011 1100000 11000 101 11101111 10111111 10111101 1100000 10100 11101111 10111111 10111101 11101111 10111111 10111101 1010001 110000 1000110 11101111 10111111 10111101 101000 11000 101 11101111 10111111 10111101 1100000 10100 11101111 10111111 10111101 11101111 10111111 10111101 1010001 1000000 111111 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 1111110 11101111 10111111 10111101 1 11101111 10111111 10111101 1101111 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 1110011 0 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 101100 11101111 10111111 10111101 110001 10010 111111 11101111 10111111
10111101 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 1111100 11101111 10111111 10111101 11100 110100 1111110 11110 11010 111111 10111 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 11101111 10111111 10111101 110011 11100111 10100011 10111010 11101111 10111111 10111101 0 11101111 10111111 10111101 101000 11000 101 1100 0 1110000 10111 11000 1001000 100001 11001110 10110101 1001011 0 0 0 0 1001001 1000101 1001110 1000100 11101111 10111111 10111101 1000010 1100000 11101111 10111111 10111101

Bon par acquis de conscience, j'ai utilisé la lib pour python 2.7, mais en fait je sais toujours pas quoi faire de la variable img, par contre je n'ai pas le même jeu de caractères (donc encodage différent je suppose ?) dans la console :

img = cont.get_str("img")
print(img)
ëPNG

IHDR   u   ┴╔╚   ╦æm£   ═PLTER
                              ©ƒ­J?═±®         pHYs  ─  ─╔ò+?   mIDATHëc`║ú`îéQ0
═}6ñ{ë:  ðâW:w    IEND«B`é³═lg>#°³37│y╬■~ YÌ│╣╝╔╬ùØÃV┘\åÉù×Ãf8█
                                                                í <ø┴g╝ƒü▒!

Je sais que ça vient de ma mauvaise compréhension de l'encodage et de la manipulation de fichier binaire mais là je suis à court d'idées et de mots clés sur google hmm

Last edited by D4mocl3s (2018-09-26 16:44:48)

Offline

#6 2018-09-27 10:03:32

Metatr0n
Administrator
Registered: 2011-04-24
Posts: 205

Re: Manipulation fichiers/données binaires (Python) [Résolu]

Hello,

Je crois que tu confonds beaucoup de choses ^^.

Déjà, je dois te dire que je connais très peu Python et que je n'ai quasi jamais codé dans ce langage, donc je ne vais pas pourvoir t'aider dans les fonctions à utiliser. Mais je peux t'expliquer deux trois trucs de principes.

Dans un premier temps, je te conseillerais de te renseigner à propos de comment manipuler (ouvrir et traiter) une image PNG normale avec Python, venant de ton disque dur. Fais un petit programme qui ouvre une image, lis la valeur d'un pixel, etc.

Ensuite, la lib d'images que tu utiliseras (je suppose que Python en a une native, sinon tu peux utiliser OpenCV qui est la référence en la matière) proposera surement de créer une variable image à partir de données binaires déjà contenues dans une variable, à la place d'ouvrir une image sur le disque dur. Trouve cette fonction et regarde le type de variable qu'elle prend en paramètre, pour savoir comment stocker l'image que tu vas récupérer sur µContest.


Tu as parlé d'encodage. L'encodage ne vaut QUE pour les chaînes de caractères qu'on souhaite interpréter en tant que telle et afficher. Les données que tu récupères sur la page de l'épreuve, sont des données BINAIRES, qui ne correspondent PAS à une chaîne de caractères lisible, ça n'a donc pas de sens de se demander quel encodage a été utilisé.
Le truc que tu peux tester est le suivant :
   - Récupère la donnée binaire du site (ce que tu fais déjà, dans data['img']['Valeur] si j'ai bien compris)
   - Crée un fichier vide test.png et écris ces données telles quelles dedans
Si tu peux ouvrir le fichier test.png comme une image normale avec ton explorateur de fichier, c'est que tu as bien réussi à récupérer l'image. Il faudra alors utiliser data['img']['Valeur] avec la fonction dont je te parlais, celle qui te permet de créer une image à partir de données binaires. Si vraiment ce n'est pas possible, tu peux toujours créer ce fichier test.png et le lire immédiatement après avec la lib image, ça fait une écriture sur le disque en plus quoi.


Enfin, dans les données binaires d'une image PNG, il y a une entête qui ne change jamais, et qui commence toujours par ëPNG. Tu peux le voir dans les données que tu récupères avec la lib officielle. Je remarque que ça n’apparaît pas dans les données que tu récupères toi (on dirait que ta méthode saute cette partie). Ce n'est pas normal, regarde de ce côté pourquoi. Le fait qu'on retrouve IHDR dans les deux, mais que les caractères suivants sont différents me suggère que les données binaires sont les mêmes mais qu'elles sont stockées dans des variables de types différents, du coup interprétées différemment par print (qui doit considérer deux encodages différents du coup, et affiche donc deux représentations différentes, mais derrière c'est les mêmes données).

En espérant être clair ^^

Offline

#7 2018-09-27 10:25:13

D4mocl3s
New member
Registered: 2018-08-21
Posts: 5

Re: Manipulation fichiers/données binaires (Python) [Résolu]

Bonjour,

Metatr0n

Je crois que tu confonds beaucoup de choses ^^.

Oui ça c'est une certitude ^^ J'ai du mal à me représenter le fonctionnement d'un fichier binaire et la manipulation de données binaires.

Sinon, oui ce que tu m'as répondu est très clair. Bon je me pose encore plus de questions, mais au moins ça me donne des pistes de réflexion et du grain à moudre smile
Au pire des cas, il me reste encore quelques challenges à résoudre sans données binaires ^^

Dans tous les cas, je m'éclate bien avec ces challenges pour progresser en python et merci à toi d'avoir pris de ton temps pour me répondre, sûrement que ça aidera des personnes se confrontant à ce problème de compréhension smile

EDIT : J'ai trouvé la solution ! Bien sûr c'est toujours à ce moment où on se dit que c'est simple en fin de compte...

hexStr = data['hex']['Valeur'].replace(' ', '')

data['img']['Valeur'] = binascii.unhexlify(hexStr)

with open("D:/Programmation/Python/MicroContest/Image_" + str(20) + ".png", "wb") as mon_fichier:

    mon_fichier.write(struct.pack(str(len(data['img']['Valeur'])) + 's', data['img']['Valeur']))

Last edited by D4mocl3s (2018-09-28 10:09:57)

Offline

#8 2018-09-28 17:59:51

Metatr0n
Administrator
Registered: 2011-04-24
Posts: 205

Re: Manipulation fichiers/données binaires (Python) [Résolu]

Ahah content que tu aies trouvé la solution.

En fait, il y a un flou chez énormément de monde sur la notion de données binaires ou de données textuelles, mais c'est en réalité très simple.
C'est UNIQUEMENT une question d'interprétation des données binaires.

Une donnée (ou un fichier) est dite "binaire", si elle ne correspond pas à un texte affichable.
Par exemple, un fichier image contient des données mais ces données ne correspondent pas à du texte, donc on dit que c'est un fichier binaire.
A l'inverse, un fichier .txt contenant du texte, va contenir des octets qui correspondent à des caractères. On dira donc plutôt que c'est un fichier textuel, en opposition à un fichier binaire. Mais en réalité, les caractères sont stockés en binaire aussi. Physiquement, tout fichier est binaire.

Mais imagine que tu génères une énorme image aléatoirement. Quelque part dans le fichier (dit binaire du coup), tu as une chance non nulle d'avoir une suite d'octets qui correspondraient au texte "coucou" d'un fichier texte par exemple. Or ces octets là, tu sais bien que ce n'est pas du texte, puisque c'est une partie de l'image, mais concrètement ils correspondent à des caractères textuels si tu essaies des les afficher en tant que texte.

Donc le caractère binaire d'un fichier dépend juste de l'interprétation qu'on en fait.

Et pour finir, dans le cas des fichiers textes, c'est LA qu'il faut justement savoir comment le texte a été encodé.
Il peut avoir été encodé avec la table ASCII (le caractère A correspond alors à l'octet 01000001, B à 01000010 et ainsi de suite, tu peux trouver facilement la table en ligne) ou d'autres tables plus complexes (Unicode par exemple, UTF-8).

Si tu ne connais pas l'encodage d'un fichier texte, tu peux essayer de deviner et interpréter les octets avec la table de ton choix, mais tu prends le risque de te tromper et de ne pas afficher le texte correctement. C'est ce qu'il se passe quand on voit des problèmes d'accents parfois, comme on voit sur cette image :


Voilà j'espère que c'est un peu plus clair.
Que ce soit dans un fichier ou dans la mémoire, les données restent des bits et à 1 et à 0, et ce qu'elles représentent doit être lu avec la bonne interprétation.



Dans tous les cas, si tu n'arrives pas à lire les données des épreuves avec ton programme, tu peux toujours utiliser la lib Python qu'on fournit wink

Offline

#9 2018-10-02 16:00:08

D4mocl3s
New member
Registered: 2018-08-21
Posts: 5

Re: Manipulation fichiers/données binaires (Python) [Résolu]

Je te remercie pour toutes ces précisions cruciales, je pense que sans ces dernières je n'aurai pas pu résoudre tous mes problèmes.

Car oui en fait, j'avais aussi un second problème que je viens de résoudre à l'instant. Pour certains challenges, il y a les données binaires encodées en hexa ou en base64. Là ça marchait bien mais j'avais encore des soucis avec les challenges sans ces encodages. J'ai pas encore vraiment bien compris l'origine du problème (et surtout parce que je persiste avec l'utilisation de mes propres fonctions roll ) mais pour ceux qui utiliseraient le module Requests, faire attention à utiliser r.content au lieu de r.text et décoder en latin-1.

r = requests.post("http://www.microcontest.com/contests/" + str(challengeID) + page, data=data)

r.content.decode('latin-1')

J'ai fait tellement d'essais que je m'y perds mais je suppose que ce qui m'a fait perdre du temps c'est qu'il y a plusieurs  d'appliqués de la donnée binaire "brute" à la donnée binaire interprétée pour l'affichage en page web.
Et en fonction de comment on récupère les données (avec  qui applique un encodage par dessus si je comprends bien), si on ne décode et réencode pas correctement pour le traitement des chaînes de caractères ainsi que pour l'écriture binaire des fichiers, on obtient au final des données binaires sensiblement différentes.

Pour résumer, comme tu l'avais dit dans ton deuxième post (à ce moment j'avais pas trop compris où tu voulais en venir), mais en effet, il est plus aisé de travailler avec des encodages au format ASCII car pas de soucis d'interprétations de données binaires en caractères affichables variants suivant l'encodage de la page.

Bon il doit encore avoir des trucs qui m'échappent ^^ Mais pour l'instant j'arrive à récupérer toutes les données binaires des challenges que ce soit sous forme "brut" ou avec un encodage en hexa ou base64, en tout cas ça a été un vrai challenge pour le coup et j'ai appris plein de choses big_smile

Last edited by D4mocl3s (2018-10-02 17:33:28)

Offline

#10 2018-10-02 21:39:45

Metatr0n
Administrator
Registered: 2011-04-24
Posts: 205

Re: Manipulation fichiers/données binaires (Python) [Résolu]

Bravo à toi ^^

oui tu as raison, récupérer les données c'est une épreuve à elle toute seule, et c'est une épreuve difficile en plus. C'est pour ça qu'on a décidé de fournir des libs toutes faites pour que les gens n'aient pas à se soucier de ça et ne se découragent pas dès le début (c'est déjà suffisamment compliqué d'entrer dans le concept du site comme ça)

Bonne continuation, n'hésite pas si besoin wink

Offline

Board footer

Powered by FluxBB