IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Parsage d'un fichier binaire en php


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Immobilier
    Inscrit en
    Février 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Immobilier

    Informations forums :
    Inscription : Février 2017
    Messages : 16
    Par défaut Parsage d'un fichier binaire en php
    Salut à tous je souhaite réaliser une classe pour parser un fichier binaire de 320 ko encodés en litte indian.

    Comme vous le savez un fichier binaire contient pour chacun des valeurs du fichier une adresse hexadecimale equivalente.

    J'ai besoin de recuperer certaines valeurs dans ce fichier en fonction de pattern de recherche.

    ( exemple je recherche la valeur hexadecimal se situant apràs une sequence de 5 valeurs hexadecimal tel que 11 70 17 28 23 ).

    je ne sais vraiment pas comment débuter étant donné que je n'ai trouvé aucun exemple concret. existe t'il seulement une fonction php pour faire ceci !!?

    Voici le debut de mon code

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
    Class GestionFichierBinaire {
     
    private $sFichierBin ='';
     
    static $aInfoBin = array();
     
     
    //constructeur
     
    function __construct ($sFichierBinaire){
     
    	$this->sFichierBin = $sFichierBinaire;
     
     
    	if ( TRUE === file_exists ($this->sFichierBin)){
     
    		$sExtFichier = new SplFileInfo ($this->sFichierBin);
     
    		if ($sExtFichier ->getExtension() !== '.bin'){
     
     
    			if ( '320 ' == round(filesize($this->sFichierBin)/1024)){
     
    				// on verifie maintenant l'encodage du fichier  mb detect encoding
    				if (
     
     
     
    			}
    			else{
    				throw new Exception ('Le fichier binaire '.$this->sFichierBin.' ne fait pas 320 ko. il fait '.round(filesize($this->sFichierBin)/1024));
    			}// fin du else
     
    		}
    		else{
    			throw new Exception ( 'Le fichier n\existe pas !');
    		}//fin du else 
    	}
     
    }// fin du constructeur
     
    }
    ?>
    premiere question je n'arrive pas à efffectuer une comparaison typée avec ce que me renvoit la fonction round(filsize()). ou est mon erreur

    deuxiemement : je souhaite utiliser la fonction mb detect encoding pour pouvoir detecter l'encodage de mon fichier.

    Si je regarde la description de cette fonction , celle-ci attend une chaine de caractere ?? ça ne serait pas vraiment un probleme mais un fichier hexadecimal n'est pas une chaine de caractere non ? et comment realiser la comparaison typée avec little endian ?

    merci

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Pour la recherche et l'extraction de la donnée qui t'intéresse tu peux utiliser les expressions régulières (regexp).
    Peux tu poster une partie du contenu d'un fichier .bin car je ne comprends pas : un fichier binaire contient pour chacun des valeurs du fichier une adresse hexadecimale equivalente.

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Pour lire un fichier binaire , il faut utiliser la fonction unpack qui te permet de spécifier quelle type de données tu attends.

    Tu as le détail des format possible ici : http://php.net/manual/fr/function.pack.php

    un exemple simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $fp = fopen("fichierbinaire", "rb");     
    $data = fread($fp, 4);
    $entier= unpack("i", $data); // ici je récupère la valeur du int (i) contenu dans les 4 octets lus
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    Immobilier
    Inscrit en
    Février 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Immobilier

    Informations forums :
    Inscription : Février 2017
    Messages : 16
    Par défaut
    Pour badaze, voici un fichier exemple de bin

    Nom : FinFuelMap.png
Affichages : 2344
Taille : 68,1 Ko

    dans mon exemple je souhaite par exemple rechercher la valeur hexadecimal 26 qui correspond à l'adresse hexadecimal 0x4d6ef.

    j'aimerai donc recuperer dans un premier temps la valeur de cette adresse.

    Concernant ma recherche sur le littre endian, j'ai l'impression qu'en fait rien dans ce document ne me permettra de le verifier ( pas de meta pas de signes distinctifs). Il faut juste que je sache qu'il est encodé en little indian ( FSB et MSB). donc quand je decompacterai, il faudra que j'inverse en mettant le bit de point fort en premier soit en MSB comme l'homme aime le dire soit l'argument H dans la fonction unpack ("H) ...

    Merci grunk. J'avais compris cette exemple. Mais dans mon cas je souhaite lire à partir d'une valeur donnée. il me faudrait une fonction du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $fp = fopen("fichierbinaire", "rb");     
    $data = fread($fp, 8,'mask' );                   // je veux lire les 8 octets après avoir trouvé la sequence defini par mon mask
    $entier= unpack("H", $data); // ici je récupère la valeur de la chaine hexadecimal (H) bit de poids fort en premier contenu dans les 8 octets lus

  5. #5
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Je ne suis pas spécialiste de la question mais ces fichiers ne doivent être au final qu'un suite d'octets. Non ?
    Si oui alors peut être qu'une lecture de l'octet qui se trouve en Xème position suffit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $position = 10; // lit le 11ème caractère
     
    $fp = fopen('toto1.txt', 'r');
    fseek($fp, $position);
    $data = fgets($fp, 2);
     
    print ord($data)." - ".$data;

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Cette valeur n'est jamais au même endroit dans le fichier ?
    Parce que si c'est le cas il suffit de lire le bon nombre d'octet à partir du bon endroit (fseek).

    Sinon peut être essayer de passer par bin2hex() pour avoir une représentation hexa du fichier et donc chercher la valeur précise de ce que tu veux
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre averti
    Homme Profil pro
    Immobilier
    Inscrit en
    Février 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Immobilier

    Informations forums :
    Inscription : Février 2017
    Messages : 16
    Par défaut
    tout à fait ce n'est jamais à la même position, position que je retrouve par le biais de ma sequence de valeurs hexadecimale qui pourrait definir un masque qui serait 11 70 17 28 23 d'après mon exemple de depart afin de rester concis.

    c'est toute la difficulté de ma recherche.

    Je veux à la fois récupérer l'adresse hexadecimal qui correspond à la valeur qui suit la sequence 11 70 17 28 23 qui sera de la forme 0x00000 mais également les valeurs.

    je vais essayer de faire une capture d'ecran afin d'illustrer mon propos

    en rouge mon masque de recherche soit 11 70 17 28 23
    en bleu la valeur hexadecimal recherchée et qui suit mon masque de recherche
    en vert l'adresse hexadecimal qui correspond à cette valeur hexadecimal

    Nom : ExplicationRechercheSection.png
Affichages : 2043
Taille : 93,5 Ko

Discussions similaires

  1. Initialiser un fichier binaire en php
    Par zyzzx dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2012, 13h36
  2. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30
  3. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20
  4. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19
  5. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo