Partage
  • Partager sur Facebook
  • Partager sur Twitter

Explication d'un code svp

Sujet résolu
    30 mars 2011 à 20:58:04

    Salut :)

    voila j'ai trouvé ce code pour récupérer les tags d'un fichier mp3. Il marche sans problème, mais je ne comprend pas certaines choses (3).

    1 ) Ligne 16 : StreamReadWrite.Seek(-128, System.IO.SeekOrigin.End)
    2 ) Ligne 17 : StreamReadWrite.Read(Buffer, 0, 128)
    3 ) Ligne 22 : TagID3.Substring(3, 30).Trim.Replace(Chr(0), "").Trim(CChar(vbNullChar))

    1) ça stocke temporairement les valeurs a partir de l'offset -128 jusque à la fin du fichier ?? Mais qu'est ce qu'un offset exactement ? (-128 est un offset), j'ai lu aussi la définition de l'offset l'offset est un « déplacement » par rapport à un emplacement mémoire. mais je ne comprend toujours pas qu'est ce qui ce passe derrière tous ça, qu'est ce que ça stocke ect...


    Me.filename = Me.path.Substring(Me.path.LastIndexOf("\") + 1)
            Me.title = Me.filename
            Me.directory = Me.path.Substring(0, Me.path.LastIndexOf("\") + 1)
    
            Dim Buffer(128) As Byte
            Dim StreamReadWrite As System.IO.FileStream
            Dim Encodeur As New System.Text.ASCIIEncoding 'Représente un encodage de caractère ASCII de caractères Unicode.
            Try
                StreamReadWrite = New System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite)
            Catch ex As Exception
                Exit Sub
            End Try
    
            Dim TagID3 As String
    
            StreamReadWrite.Seek(-128, System.IO.SeekOrigin.End) ' Affecte la valeur donnée à la position actuelle de ce flux // l'offset est un « déplacement » par rapport à un emplacement mémoire
            StreamReadWrite.Read(Buffer, 0, 128) 'Lit un bloc d'octets à partir du flux et écrit les données dans une mémoire tampon donnée.
            TagID3 = Encodeur.GetString(Buffer) ' Décode une séquence d'octets en une chaîne.
    
            If TagID3.Substring(0, 3).Equals("TAG") Then
    
                Me.title = TagID3.Substring(3, 30).Trim.Replace(Chr(0), "").Trim(CChar(vbNullChar)) 'Substring(3, 30) Ok,
    
                Me.artist = TagID3.Substring(33, 30).Trim.Trim.Replace(Chr(0), "").Trim(CChar(vbNullChar))
    
                Me.album = TagID3.Substring(63, 30).Trim.Trim.Replace(Chr(0), "").Trim(CChar(vbNullChar))
    
                Me.comments = TagID3.Substring(97, 28).Trim.Trim.Replace(Chr(0), "").Trim(CChar(vbNullChar))
    
                If TagID3.Chars(125).Equals(0) Then
    
                    Me.track = Buffer.GetValue(126)
    
                Else
                    Me.track = 0
    
                    Me.genre = Buffer.GetValue(127)
                    If Me.genre = "" Or Me.genre = " " Then
                        Me.genre = "255"
                    End If
    
                    If Me.title = "" Then Me.title = Me.filename
    
    
    
                    StreamReadWrite.Close()
    
                End If
            End If
    


    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      31 mars 2011 à 0:32:04

      Pour la définit de base : Un flux de données (représenté par la classe de base Stream) est une structure de données qui ne contient pas les données en question mais des "pointeurs" vers ces données. En .NET, les flux contiennent notamment de quoi se positionner dans le flux (le début commençant à 0, la fin terminant à la taille totale du flux), de lire une certaine quantité de donnée mais également d'en écrire.

      Citation : Graphmaster

      Ligne 16 : StreamReadWrite.Seek(-128, System.IO.SeekOrigin.End)


      La méthode Seek permet de se déplacer dans un flux de données. Dans le cas présent, le déplacement s'effectue en partant de la fin du flux (SeekOrigin.End) et se place à 128 octets de la fin. Un équivalent de ce code serait StreamReadWrite.Seek(StreamReadWrite.Length - 128, System.IO.SeekOrigin.Begin).

      Citation : Graphmaster

      Ligne 17 : StreamReadWrite.Read(Buffer, 0, 128)


      On est typiquement dans un cas de lecture de données. La méthode Read prend trois arguments :
      -Le premier est un tableau d'octet (généralement appelé buffer) qui contiendra les données lues depuis le flux.
      -Le deuxième est un entier indiquant à partir de quelle case du buffer de sortie on place les données. Ici, spécifier 0 indique qu'on commence à remplir le buffer de sortie à partir de la case à l'index 0, soit le début du tableau d'octet.
      -Le 3eme est la quantité maximale de données à lire. Ici, on indique 128 ce qui veut dire qu'on lira un maximum de 128 octets. Ces 128 octets seront placés dans le tableau d'octet "Buffer". Il est à noté que la méthode Read ne va pas forcément lire 128 octets (si on atteind la fin du flux avant les 128 octets par exemple). C'est pourquoi Read retourne un entier qui indique la quantité d'octet réellement lus.

      Si je met en relation les lignes 16 et 17, ce code va simplement aller lire, dans ton flux de données, les 128 derniers octets et les placer dans un tableau d'octet nommé "Buffer".

      Citation : Graphmaster

      Ligne 22 : TagID3.Substring(3, 30).Trim.Replace(Chr(0), "").Trim(CChar(vbNullChar))


      Beaucoup de choses ici.
      -Substring retourne une sous-chaine de caractère. Le premier argument est l'index du caractère de départ et le deuxième, le nombre de caractère récupérés. Ici, on récupère les caractères en partant du 3eme caractère et totalisant 30 caractères. Il y a une surcharge de Substring qui ne prend que l'index de départ.
      -Trim se charge de supprimer tous les caractères vides (espace, tabulation, retour charriot...)
      -Replace a deux versions : L'une qui remplace une chaine de caractère par une autre (elle est utilisée ici pour supprimer le contenu retourné par Chr(0)) et l'autre qui remplace des caractères dans une chaine par un autre.
      • Partager sur Facebook
      • Partager sur Twitter

      Explication d'un code svp

      × 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