Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lecture binaire

Pour optimisation

    19 octobre 2018 à 7:36:38

    Bonjour à tous.

    Dans mon projet, je fais appel à un fichier texte de plusieurs millier de lignes. Chaque ligne est un chiffre de moins de 256. Autrement dit, chaque ligne contient un chiffre qui tient sur 8bits (1 octet). Il se présente ainsi :

    253
    15
    68
    14
    129

    Dans ce fichier exemple, il prendra 20 octets sur le serveur. (octet d'ouverture, 1 octet par chiffre,1 octet pour chaque retour chariot etc...) Je le lis actuellement avec fgets()

    L'idée serait d'avoir un fichier binaire qui stockerait le fichier précédent sous la forme suivante:

    ‭11111101‬‭00001111‬‭01000100‬0000‭1110‬‭10000001‬

    Ce qui nous donnerais un fichier de 5 octets sur le serveur au lieu de 20. Sachant que chaque fichier devrait contenir des milliers d'octets et qu'il devrait y avoir des milliers de fichiers différent, je pense que l'idée d’optimiser est une piste à suivre...

    Mais je me trompe peut-être?

    La question est donc la suivante, est-ce que mon idée est réalisable à mettre en place en php? quel serait alors les pistes?

    -
    Edité par Nui Prabpai 19 octobre 2018 à 7:38:57

    • Partager sur Facebook
    • Partager sur Twitter
      19 octobre 2018 à 8:03:48

      si tu comprends le binaire alors c'est tout simple.

      un manque de recherche de ta part...

      un code de test? Des recherches?

      • Partager sur Facebook
      • Partager sur Twitter

      Jeune et ambitieux Htmlspecialschars  - Var_dump

        19 octobre 2018 à 8:20:03

        Oui je comprends le binaire.

        Oui j'ai fait des recherches non je ne trouve pas ce que je veux

        Soit ce que je lis est déjà acquis pour moi. (j'ai pas besoins d'explications sur le binaire hex octal ou autre) soit c'est hors contexte. je trouve aussi des pistes intéressantes comme ici, sur ce site : https://openclassrooms.com/fr/courses/1248601-lecture-et-ecriture-de-fichiers-en-mode-binaire sauf que ca ne concerne pas le PHP

        Non je n'ai pas de code de test puisque ma question d'origine n'est pas de demander un code tout prêt, mais de savoir si ma réflexion est légitime ou pas... Ce que je demande n'est pas demandé 20 fois par semaine il me semble.

        Franchement, marre de lire ce type de propos... Désolé

        -
        Edité par Nui Prabpai 19 octobre 2018 à 8:37:06

        • Partager sur Facebook
        • Partager sur Twitter
          19 octobre 2018 à 8:40:53

          Nui Prabpai a écrit:

          Oui je comprends le binaire.

          Oui j'ai fait des recherches non je ne trouve pas ce que je veux

          Soit ce que je lis est déjà acquis pour moi. (j'ai pas besoins d'explications sur le binaire hex octal ou autre) soit c'est hors contexte. je trouve aussi des pistes intéressantes comme ici, sur ce site : https://openclassrooms.com/fr/courses/1248601-lecture-et-ecriture-de-fichiers-en-mode-binaire sauf que ca ne concerne pas le PHP

          Non je n'ai pas de code de test puisque ma question d'origine n'est pas de demander un code tout prêt, mais de savoir si ma réflexion est légitime ou pas... Ce que je demande n'est pas demandé 20 fois par semaine il me semble.

          Franchement, marre de lire ce type de propos... Désolé

          -
          Edité par Nui Prabpai il y a 2 minutes

          Tu as fait un algorithme ? de ce que tu veux de precis en francais?

          apres le code c'est une autre etapes :)

          et le binaire en php c'est pas ce quil y a de plus compliqu, un peu de recherche ou de réflexion et hop on est parit! :)

          • Partager sur Facebook
          • Partager sur Twitter

          Jeune et ambitieux Htmlspecialschars  - Var_dump

            19 octobre 2018 à 9:24:38

            Bonjours, 

            En regardant un peut je te propose qu'elle que chose:

            la fonction fread lit en mode binaire. 

            Je promet rien mais essaye. Pour voire ceux que retourne la fonction essaye un print_r($le_contenu).

            Cordialement

            -
            Edité par LenX1s 19 octobre 2018 à 9:26:24

            • Partager sur Facebook
            • Partager sur Twitter
            Google est beau et gentils il vous donnera toujours tout si vous lui demandé gentiment comme ceci
              19 octobre 2018 à 9:36:18

              Merci beaucoup @LenX1s, J'en demandais pas plus, je suis cette piste qui me semble pertinente. (Fread)

              Quand à Vassili, je me demande si tu as vraiment lu mon post. 

              • Partager sur Facebook
              • Partager sur Twitter
                19 octobre 2018 à 9:41:38

                Apres je t'avoue que cet fonction je la connais simplement de nom(je l'ai trouver il y'a 10 jours quand je me suis balader sur la doc php), je ne sais pas le format de retour : si il y'a l'octet d'ouverture si les octets de retour chariot ... mais je pence que tu peut t'en sortir.

                Edit :

                Pour mes competence perso je te donne une piste :

                <?php
                // Lit un fichier, et le place dans une chaîne
                $filename = "binaire.txt";
                $handle = fopen($filename, "r");//on recupere le pointeur 
                $contents = fread($handle, filesize($filename));//on recupere ce qui a dans le fichier qui est pointer
                fclose($handle);//on ferme le pointeur 
                
                echo $contents;//je fait un petit affichage pour voire ce qui resort (c'est pas du binnaire donc je le traduit)
                
                $decouper = explode("\n", $contents);// je decoupe la chaine a tout les\n donc les retoure lignes 
                
                $concatenation = "";//initialisation de ma variable 
                foreach ($decouper as &$value) {//pour tout les occurences 
                    echo decbin($value)."</br>";// on affiche pour tou bien voire 
                    $concatenation .= decbin($value) ;// on ajoute a la chaine 
                }
                
                
                echo $concatenation;// et on affiche le resultat final
                
                ?>



                les docs :

                explode 

                decbin

                -
                Edité par LenX1s 19 octobre 2018 à 10:37:12

                • Partager sur Facebook
                • Partager sur Twitter
                Google est beau et gentils il vous donnera toujours tout si vous lui demandé gentiment comme ceci
                  19 octobre 2018 à 11:55:40

                  Merci pour ton implication,

                  Je cherche à stocker mes données décimal en Binaire dans un fichier pour gagner de la place, hors si je lis bien ton code, tu récupères une données décimal que tu transformes pour un affichage binaire...

                  Je n'ai pas eu le temps de m'en occuper depuis tout à l'heure. je vais me concentrer sur ta première info ( fread ) 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 octobre 2018 à 11:57:58

                    Ok mais ou récupéré tu les décimaux sur un fichier ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Google est beau et gentils il vous donnera toujours tout si vous lui demandé gentiment comme ceci
                      19 octobre 2018 à 13:11:03

                      Sous forme binaire.... Ce serait un peu long d'expliquer.

                      Grace à ton aide, je suis tombé sur le tuto super intéressant de ce site :https://openclassrooms.com/fr/courses/1248601-lecture-et-ecriture-de-fichiers-en-mode-binaire

                      C'est exactement ce que je veux faire, sauf que c'est du C. Bien que proche du PHP, ça reste différent....

                      Le tuto parle bien du Fread() et il utilise le mode "wb" pour écrire en binaire. Le mode "wb" n’existe pas dans le manuel PHP. Du coup, Je me dit que PHP ne gère pas directement en binaire, en tout cas, pas avec Fread()

                      Si une âme sensible pouvait me confirmer?

                      Peut-être @Vassili qui semble dire que c'est facile, mais qui ne partage pas ses connaissances?

                      -
                      Edité par Nui Prabpai 19 octobre 2018 à 13:11:50

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 octobre 2018 à 14:12:38

                        Si tu les récupéré sous la form demimal tu peut utiliser la fonction que je t'ai donner plus haut : 

                        decbin

                        Qui traduit les nombre décimal en binaire, cela ajoute un étape par rapport au C mais ca rend la chose posible.

                        Ps : quand j'ai ou tu les récupère je pensais a comment c'est a dire : Dans un fichier, entrer utilisateur ?? 

                        Si c'est dans un fichier tu peu récupère mon code je l'ai commenter pour ^^ tu a juste a l'adapter.

                        Sinon je pourrais t'aider si tu me dit comment tu les récupère ^^.

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Google est beau et gentils il vous donnera toujours tout si vous lui demandé gentiment comme ceci
                          19 octobre 2018 à 14:20:08

                          Salut,

                          Le mode wb existe bien sur fopen pour ouvrir un fichier en mode binaire. En fait le 'b' est une option que tu peux appliquer sur le mode 'w' pour préciser que c'est en binaire.

                          Si tu traite toutes tes opérations (lecture/ecriture/ouverture) en mode binaire tu ne devrais pas avoir trop de soucis. Pense à bien utiliser fwrite et fread quand tu travaille avec des fichiers binaires.

                          Avec tout ça tu devrais pouvoir réecrire tes fichiers en mode binaire pour gagner de la place.

                          Je te met un extrait de la doc php sur le sujet :

                          Note:

                          Les systèmes d'exploitation utilisent différents caractères pour les nouvelles lignes. Lorsque vous écrivez un fichier texte, et insérez une nouvelle ligne, vous devez utiliser le bon caractère pour votre système d'exploitation. Les systèmes Unix utilisent \n comme nouvelle ligne, les systèmes Windows utilisent \r\n, et les systèmes Macintosh utilisent \r.

                          Si vous n'utilisez pas le bon caractère de nouvelle ligne lors de l'écriture de vos fichiers, vous risquez d'ouvrir vos fichiers avec des applications qui donneront un aspect 'bizarre' au texte.

                          Windows propose un mode de traduction ('t'), qui va traduire automatiquement les caractères \n en \r\n lorsque vous travaillez sur le fichier. À l'inverse, vous pouvez utiliser l'option 'b' pour forcer le fichier a être écrit en mode binaire, sans traduction des données. Pour utiliser ces options, ajoutez 'b' ou 't' comme dernier caractère du paramètre mode.

                          -
                          Edité par Vince_85 19 octobre 2018 à 14:21:16

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 octobre 2018 à 15:18:56

                            Merci pour vos aides.

                            J'ai fait pour test le bout de code suivant:

                            <?php
                            $fp = fopen('data.bin', 'wb');
                            fwrite($fp, 0b11111110); //253 en décimal
                            fclose($fp);
                            ?>


                            Pas de message d'erreurs du navigateur et le fichier data.bin est bien créer sur le disque. Mais, il fait 3 octets au lieu d'1. si j'ouvre le fichier avec notepad, il affiche 253 alors qu'il devrait m'afficher un caractère illisible s'il avait bien été inscrit en binaire.... J'ai oublié quelque chose?

                            -
                            Edité par Nui Prabpai 19 octobre 2018 à 15:19:46

                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 octobre 2018 à 9:44:37

                              bonjour
                               

                              0b11111110 c'est 254 et pas 253.( jiimagine que cest une erreur de transcription)
                              fwrite semble compter les caracteres et  pourtant ils parlent d'octet mais aussi de byte dans la version anglaise ( 8 bits) ( si c une erreur c'.est gros )

                              donc ton code renvoi bien 3 puisque Il ecrit 3 caractere (254, 1 un ;un 5, un 4) dans ton fichier. 
                              donc si tu veux ecrire du binaire faut que tu laisses tel quel sans le 0b ( fwrite ecrit une chaine).
                              j'ai  pas eu le temps de bien capter ta problématique.
                              mais  l'interet du binaire c'est de mettre plusieurs infos dans une seule variable puis de l'analyser avec les O.B.S ;opérateur sur le bit.
                              je pense que ce n'est pas cela que tu cherches..
                              au point de vu stockage  253 ne prends pas plus (ou moins) de place que 11111101.
                              tu peux toujours faire ce que tu as fait (m^me si cest faux !)

                              253
                              15
                              68
                              14
                              129

                              donnerai  111111011111100010010000001 et pas  11111101‬‭00001111‬‭01000100‬0000‭1110‬‭10000001‬

                              mais ce n'est pas important.
                              donc Fwrite ajoutant les ecriture les unes apres les autres tu peux le faire .

                              <?php
                              $fp = fopen('data.bin', 'w');
                              fwrite($fp, 11111101);
                              fwrite($fp, 1111);
                              fclose($fp);
                              
                              // le contenu de 'data.bin' est maintenant 111111011111
                              ?>



                              mais honnêtement je n'en vois pas l'intérêt car comment vas tu retrouver tes info une fois que tu auras une chaine de 40 caracteres et comment vas tu la découper pour retrouver tes infos?
                              et surtout ou peut être le gain espéré?

                              pour moi ce que tu veux faire c'est ecrire  en fait 253156814129 ( si on reste en décimal) mais j'en vois pas l'interet.

                              Bien entendu; j'ai pas forcement capté ce que tu voulais . lol 

                              -
                              Edité par hubeert 21 octobre 2018 à 9:51:23

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                21 octobre 2018 à 20:23:08

                                Hello.

                                Nui Prabpai a écrit:

                                 le fichier data.bin est bien créer sur le disque. Mais, il fait 3 octets au lieu d'1.

                                Les fonctions pack() et unpack() existent pour traduire les entiers php en binaire et inversement. Mais comme le besoin est toujours sur l'octet, il est peut être plus simple d'utiliser chr() et ord():

                                $fp = fopen('data.bin', 'wb');
                                fwrite($fp, chr(253)); // entier php 253 vers un octet binaire
                                fclose($fp);
                                
                                $fp = fopen('data.bin', 'rb');
                                echo ord(fread($fp, 1)); // relire un octet binaire vers un entier php
                                fclose($fp);
                                
                                // sinon pack/unpack
                                $bin = pack('s', 253); // s car un seul octet
                                echo ' retour en int ', unpack('s', $bin)[1];
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Lecture binaire

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown