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

C# Discussion :

Chercher des caractères dans un fichier binaire


Sujet :

C#

  1. #1
    Invité
    Invité(e)
    Par défaut Chercher des caractères dans un fichier binaire
    Bonjour,

    Je cherche à savoir où se trouve une chaine de caractère dans un fichier binaire. J'avais pensé à utiliser Regex.Match mais sans succès car il faut utiliser un string en 1er argument ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fichier_binaire.BaseStream.Seek(70679449, SeekOrigin.Begin); //je me place au début de la zone de recherche
    byte[] texte_byte = fichier_tasks_binaire.ReadBytes(50000); //je récupère une grande partie de caractères dans lesquels se trouve la chaine que je rehcerche
    //Match match = Regex.Match(texte_byte, "\x043\x002\x000\x000");
    Match match = Regex.Match("test123", "\x031\x032"); //un test de match recherchant des caractères hexadécimaux
    Console.WriteLine("{0}", match.Index); //j'affiche la position trouvée
    Une idée pour me dépanner?

    Merci d'avance.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Points : 359
    Points
    359
    Par défaut
    Et si tu montais le fichier non pas comme étant un fichier Binaire, mais un fichier text ? tu pourrais trouver une chaine de caractère correspondant à ta chaine binaire.
    "Une belle citation est un diamant au doigt de l'homme d'esprit et un caillou dans la main d'un sot."
    Joseph Roux

  3. #3
    Invité
    Invité(e)
    Par défaut
    Il ne trouve pas la partie cherchée dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fichier_binaire.BaseStream.Seek(70679449, SeekOrigin.Begin);
    string test_ligne = new string(fichier_binaire.ReadChars(50000));
    Match match = Regex.Match(test_ligne, "\x043\x002\x000\x000");
    Console.WriteLine("{0}", match.Index);
    Je ne me suis pas trompé dans le code?

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Points : 359
    Points
    359
    Par défaut
    Pour moi tu as deux choix :
    1- Tu traites ton fichier comme étant binaire, donc tu montes toutes tes informations en mémoire et tu les converties dans le bon format ( => string) puis tu appliques ton expression régulière (convertie en string sinon ça sert à rien).
    2- Tu traites ton fichier binaire comme un étant un string et la tu appliques ton expression régulière sur le texte (qui est la suite de binaire) en binaire.

    exemple :
    1- { 0x00, 0x00, 0x00, 0x00 } => int : 0 => string 0
    ta REGEX va donc rechercher 0 dans le fichier.
    2- { 0x00, 0x00, 0x00, 0x00 } => "00000000" (c'est écrit comme ça dans le fichier)
    ta REGEX va donc rechercher la suite de caractère "00000000".

    Le problème de la seconde solution c'est que tu ne vas pas prendre en compte la structure de la données. Je m'explique :

    "00000000" peut être en même temps le chiffre 0, une chaîne de caractère, la valeur FALSE d'un boolean, deux fois 0 si le type est un short, etc. ...

    Pire "AB01F0F0000000000000200F03003F0F0OF" dans cette chaîne de caractère tu trouveras l'expression régulière mais malheureusement ça ne veut rien dire.

    Donc réellement tu as toujours deux solutions, une ou tu vas traiter ta donnée et la convertir puis voir si tu REGEX est dedans (1) ou la seconde (2):

    Tu vas parcourir ton fichier binaire, en passant structure de données par structure de données pour voir si ta REGEX est présente :
    "00000000ABABABABAB787870AFE25647"
    00000000 => int => 0
    ABABABABAB787870AFE25647 => string "blablablab"

    et comme ça pour tout le fichier.

    Si tu ne m'as pas compris, je peux réexpliquer
    "Une belle citation est un diamant au doigt de l'homme d'esprit et un caillou dans la main d'un sot."
    Joseph Roux

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je pense avoir fait la méthode 1 dans mon poste précédent. En regardant ton poste je viens de penser à quelque chose.
    Si je convertis mon fichier binaire en string, il va convertir toute les séries de 4 bytes en caractère. Mais si il y a un décalage de 1 bytes ça ne va pas casser la recherche?

    En tout cas j'aimerais bien un exemple avec les 2 méthodes qui reprenne mon dernier poste. J'ai du mal à voir comment faire.

    Ps: il peut y avoir le caractère de retour chariot à rechercher, donc regex est sans doute à faire en multiligne.

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Points : 359
    Points
    359
    Par défaut
    Pourquoi tu aurais un décalage de 1 byte ?
    "Une belle citation est un diamant au doigt de l'homme d'esprit et un caillou dans la main d'un sot."
    Joseph Roux

  7. #7
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Selon moi, avec la méthode BinaryReader.ReadChars tu n'obtiendras pas de valeur hexa, mais une valeur convertie selon l'encoding utilisé.
    J’ai des questions à toutes vos réponses!

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par morgand Voir le message
    Pourquoi tu aurais un décalage de 1 byte ?
    Les caractères sont codés sur 4 bytes.
    Donc la lecture se fera par série de 4 bytes:
    0123 pour le 1er caractère, 4567 pour le 2eme.
    Si le texte en hexa que je chercher se trouve du caractère 1 au caractère 5, ça marchera ou pas?

    Citation Envoyé par -N4w4k- Voir le message
    Selon moi, avec la méthode BinaryReader.ReadChars tu n'obtiendras pas de valeur hexa, mais une valeur convertie selon l'encoding utilisé.
    Hmm, donc le texte serait converti en utf8 ou autre après s le readchar? Si c'est bien le cas c'est gênant pour faire cette recherche.

  9. #9
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Je viens de faire une petite recherche et ici j'ai trouvé une méthode qui pourrait t'interresser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static string ByteArrayToString(byte[] ba)
    {
      StringBuilder hex = new StringBuilder(ba.Length * 2);
      foreach (byte b in ba)
        hex.AppendFormat("{0:x2}", b);
      return hex.ToString();
    }
    Du coup, n'utilise plus BinaryReader.ReadChars mais plutot BinaryReader.ReadBytes.
    J’ai des questions à toutes vos réponses!

  10. #10
    Invité
    Invité(e)
    Par défaut
    Merci, je testerais ça ce soir.

    [Edit]Bon ça a l'air de n'avoir rien trouvé.

    Pour le moment j'essaye de me passer de la recherche binaire mais je pense que ça pourra toujours être utile dans le futur.
    Dernière modification par Invité ; 19/03/2013 à 20h36.

Discussions similaires

  1. Lire des octets dans un fichier binaire
    Par DiverSIG dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 19/01/2009, 10h22
  2. [Castor] Echappement des caractères <> dans un fichier XML généré par Castor XML
    Par mbinte dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 22/10/2008, 14h33
  3. Réponses: 10
    Dernier message: 09/02/2008, 11h40
  4. [MySQL] Encodage des caractères dans un fichier texte
    Par louveteau02 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/04/2007, 10h41
  5. Réponses: 3
    Dernier message: 27/06/2005, 16h24

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