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

VB.NET Discussion :

Rechercher dans un fichier [Débutant]


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Points : 45
    Points
    45
    Par défaut Rechercher dans un fichier
    Bonjour à tous,

    Je souhaiterais rechercher des positions dans un fichier binaire et noter le début de chaque position, puis la longueur entre 2 positions.

    J'ai commencé à faire obtenir la 1ère position, la 2ème puis la longueur, mais je sèche pour continuer jusqu'au bout du fichier. En obtenant les positions et longueurs, je peux récupérer des fichiers (png, doc, ect) contenu dans le bin...

    Voici 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
     
    'Tableau recherché
    Dim list As Byte() = New Byte() {80, 75, 3, 4, 20, 0, 0, 0, 8, 0}
    Dim fic As Byte() = IO.File.ReadAllBytes("C:\20131021.bin")
    Dim idx As Integer = FindSequence(fic, list, 0)
    Console.WriteLine("Position de départ : " & idx)
    If idx = 0 Then
    idx = FindSequence(fic, list, 9)
    End If
    Console.WriteLine("2ème Position de départ : " & idx)
    '--
    Dim b() As Byte = Nothing
    Using fs As New FileStream("C:\20131021.bin", FileMode.Open)
    Using rdr As New BinaryReader(fs)
    Dim c As String = fs.Seek(0, SeekOrigin.Begin)
    b = rdr.ReadBytes(idx)
    IO.File.WriteAllBytes("C:\20131021.png", b)
    End Using
    End Using
    et

    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
     
    Public Function FindSequence(ByVal list() As Byte, ByVal value() As Byte, ByVal startingpos As Long) As Integer
    Dim startIndex As Integer = Array.IndexOf(list, value(startingpos))
    Do Until startIndex = -1 OrElse list.Length - startIndex <
    value.Length
    Dim runLength As Integer = 0
    For index As Integer = 0 To value.Length - 1
    If value(index) <> list(startIndex + index) Then Exit For
    runLength += 1
    Next
    If runLength = value.Length Then Return startIndex
    startIndex = Array.IndexOf(list, value(0), startIndex +
    runLength)
    Loop
    Return -1
    End Function
    Pouvez vous m'aider ou me mettre sur la voie afin que je puisse traiter tout le fichier C:\20131021.bin, rechercher sur des bytes et continuer jusqu'au bout ?

    Merci à tous

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 21
    Points
    21
    Par défaut Programmation structurée !!!
    Je ne réponds pas à votre demande mais mes cheveux se sont hérissés quand j'ai vu la fonction.

    Ce qui suit est plus lisible et surtout compréhensible.

    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
        Public Function FindSequence(ByVal list() As Byte, ByVal value() As Byte, ByVal startingpos As Long) As Integer
            Dim runLength As Integer
            Dim ValeurDeRetour As Integer
            Dim startIndex As Integer = Array.IndexOf(list, value(startingpos))
            Do Until startIndex = -1 OrElse list.Length - startIndex < value.Length Or runLength = value.Length
                runLength = 0
                While runLength <= value.Length - 1 And value(runLength) = list(startIndex + runLength)
                    runLength += 1
                End While
                startIndex = Array.IndexOf(list, value(0), startIndex + runLength)
            Loop
            If runLength = value.Length Then
                ValeurDeRetour = startIndex
            Else
                ValeurDeRetour = -1
            End If
            Return ValeurDeRetour
        End Function

  3. #3
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Points : 45
    Points
    45
    Par défaut
    Merci MicBru, heureusement que tout le monde n'est pas débutant, mais bon, il faut bien commencer un jour

    Peux tu me détailler un peu plus la nouvelle fonction s'il te plait, ce serait sympa.

    Encore merci

  4. #4
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Bonjour

    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
    Private Class seq
            Public startpos As Int32
            Public length As Int32
        End Class
     
     Private listresult As New List(Of seq)
     Private listbinary() As Byte
      Private Function ReadBinaryFILE(ByVal filename As String) As Boolean
            If File.Exists(filename) Then
                listbinary = File.ReadAllBytes(filename)
                Return True
            Else
                Return False
            End If
        End Function 
     
        Private Function FindSeq(ByVal seqlist As List(Of Byte)) As List(Of seq)
            Dim pos, holdpos, seqindex As Integer
            Dim result As New List(Of seq)
            pos = 0
            seqindex = 0
            For Each item As Byte In listbinary
                If item = seqlist(seqindex) AndAlso seqindex < seqlist.Count Then
                    holdpos = pos
                    seqindex += 1
                Else
                    seqindex = 0
                End If
                If seqindex = seqlist.Count Then
                    Dim seqdata As New seq
                    seqdata.startpos = holdpos - seqindex + 1
                    If result.Count > 0 Then
                        seqdata.length = seqdata.startpos - result(result.Count - 1).startpos
                    Else
                      'la premiere sequence a une longueur 0 
                        seqdata.length = 0
                    End If
                    result.Add(seqdata)
                    seqindex = 0
                End If
                pos += 1
            Next
            Return result
        End Function
    pour utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If ReadBinaryFILE("C:\20131021.bin" ) Then
                Dim listtofind As New List(Of Byte)(New Byte() {80, 75, 3, 4, 20, 0, 0, 0, 8, 0})
                listresult = FindSeq(listtofind)
            End If
    bonne prog

  5. #5
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2008
    Messages : 125
    Points : 45
    Points
    45
    Par défaut
    Super, merci shayw, c'est vraiment ce que je souhaitais faire !

    Simple, clair et efficace !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Améliorer la recherche dans un fichier?
    Par abdmaa dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 09/05/2005, 13h09
  2. [LG]Runtime Error lors d'une recherche dans un fichier
    Par Fraynor dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2005, 22h51
  3. Rechercher dans un fichier avec emacs
    Par ggnore dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 24/11/2004, 10h28
  4. recherche dans un fichier xml (castor)
    Par pingoui dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 06/09/2004, 14h28
  5. [LG]rechercher dans un fichier texte
    Par BadFox dans le forum Langage
    Réponses: 11
    Dernier message: 01/12/2003, 15h57

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