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 :

recuperer (ou calculer le CRC d'un fichier)


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 11
    Points
    11
    Par défaut recuperer (ou calculer le CRC d'un fichier)
    Bonjour,
    je cherche des sources pour recuperer le crc d'un fichier (16 bits) par exemple afin de prouver l'unicité d'un fichier.
    merci de votre aide

  2. #2
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Peut-etre connaissez vous une api particulière a utiliser...

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    j'ai trouvé ça, c'est en C#mais ça doit pas être dur à traduire
    http://www.codeproject.com/csharp/cs...kAlgorithm.asp
    http://www.codeproject.com/csharp/marcelcrcencoding.asp
    http://www.codeproject.com/cs/files/crcstream.asp

    Sinon, google m'a donné ça, tu devrais éssayer google parfois ...
    http://www.vbaccelerator.com/home/NE...32/article.asp

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Moi j'ai utilisé ça, c'est le même algorithme que la commande sum sous linux :
    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
            public static int GetCheckSum(string filename, out int fileSize)
            {
                byte[] buffer = File.ReadAllBytes(filename);
                int size = buffer.Length;
                fileSize = size;
     
                Int32 cksum = 0;
                int counter = 0;
                while (size > 0)
                {
                    UInt16 val = buffer[counter];
                    cksum += Convert.ToInt32(buffer[counter]);
                    counter += 1;
                    size -= 1;
                }
                cksum = (cksum >> 16) + (cksum & 0xffff);
                cksum += (cksum >> 16);
                return cksum;
            }
    Pareil il te suffira de convertir en VB.NET

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    byte[] buffer = File.ReadAllBytes(filename);
    Ce serai peut être mieux d'avoir un buffer limité par exemple à 2048 bytes et lire au fur et à mesure, parce que si par érreur tu rentres dedans un fichier de 800 Mo, tu sera embetté non ?

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par smyley
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    byte[] buffer = File.ReadAllBytes(filename);
    Ce serai peut être mieux d'avoir un buffer limité par exemple à 2048 bytes et lire au fur et à mesure, parce que si par érreur tu rentres dedans un fichier de 800 Mo, tu sera embetté non ?
    Je fournis le code en l'état, il est adapté à mes spécifiquement à mes besoins. Je ne garantis pas qu'il fonctionnera bien pour toutes les utilisations.
    Il convient effectivement de prendre en compte ce genre de considérations en fonction des cas.
    Cette méthode est utilisée dans un traitement automatique, donc je n'ai pas intégré de gestion bloc par bloc.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Bonjour,
    Voici la version que j'utilise en VB (fortement inspirée d'un code existant déjà sur le net).
    Elle est plus longue et peut être optimisable mais c'est en partie du à ce que chaque ligne est commentée pour comprendre comment ça marche...
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
            Public Function CRC32Calculation(ByVal pFileName As String) As Long
                'BUT : Calcule la CRC du fichier en paramètre
                'RETOUR : la valeur de la CRC
     
                Dim Crc32Table(255) As Long     'Tableau permettant de calculer le CRC d'un fichier
                Dim lTableValue As Long
                Dim iCounter As Long
                Dim bCharValue As Byte
                Dim lAccValue As Long
                Dim lIndex As Long
                Dim lCrc32Value As Long
                Dim lTempCrc32 As Long
                Dim iBytes As Integer
                Dim iBits As Integer
                Dim lCrc32 As Long
     
                Dim FileData() As Byte
                Dim FileSize As Long
                Dim BinReader As BinaryReader
                Try
                    If Not FileExists(pFileName) Then
                        Return 0
                    End If
                    BinReader = New BinaryReader(File.Open(pFileName, FileMode.Open))
                    FileSize = SizeOfFile(pFileName)
                    FileData = BinReader.ReadBytes(FileSize)
                    'Initialise le tableau du CRC et ajuste le CRC par XOR
                    For iBytes = 0 To 255
                        'CRC temporaire = compteur de cycle
                        lCrc32 = iBytes
                        'Effectue un decalage de bit vers la droite
                        For iBits = 0 To 7
                            'Masque le bit de WeightList faible
                            lTempCrc32 = lCrc32 And &HFFFFFFFE
                            'Decale les bits vers la droite
                            lTempCrc32 = lTempCrc32 \ &H2
                            'Masque le bit de WeightList fort
                            lTempCrc32 = lTempCrc32 And &H7FFFFFFF
                            'Verifie si le CRC = 0 et mix avec la valeur Seed
                            If (lCrc32 And &H1) <> 0 Then
                                lCrc32 = lTempCrc32 Xor &HEDB88320
                            Else
                                lCrc32 = lTempCrc32
                            End If
                        Next
                        'Add le CRC dans la table
                        Crc32Table(iBytes) = lCrc32
                    Next
                    'On va verifier toute les données du fichier, donc Loop de 0 à [Fin du fichier]
                    For iCounter = 0 To UBound(FileData)
                        'Var temporaire = donnée du fichier à la position icounter
                        bCharValue = FileData(iCounter)
                        'Masque les bits 0 à 255 (WeightList faible)
                        lAccValue = lCrc32Value And &HFFFFFF00
                        'Divise par 256 (decalage vers la droite)
                        lAccValue = lAccValue \ &H100
                        'Masque les bits de WeightList fort
                        lAccValue = lAccValue And &HFFFFFF
                        'Recupere le module de 256
                        lIndex = lCrc32Value And &HFF
                        'XOR avec la variable temporaire
                        lIndex = lIndex Xor bCharValue
                        'Recupere le CRC dans notre table selon l'index donné par le calcul
                        lTableValue = Crc32Table(lIndex)
                        'Puis on combine avec notre valeur
                        lCrc32Value = lAccValue Xor lTableValue
                    Next
                    BinReader.Close()
                    'Renvoie le CRC
                    Return lCrc32Value
     
                Catch ex As Exception
                    'Un p'tit message si besoin est...
                    Return 0
                End Try
            End Function

Discussions similaires

  1. Recupere les tag d'entete d'un fichier mp3
    Par kirbs dans le forum C++Builder
    Réponses: 7
    Dernier message: 05/10/2006, 17h40
  2. Réponses: 11
    Dernier message: 13/01/2006, 21h54
  3. calcul du CRC sur 2 octets
    Par jeannot27 dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/12/2005, 10h55
  4. [SRC] Calcul de CRC
    Par cfdev dans le forum C++Builder
    Réponses: 3
    Dernier message: 07/03/2005, 13h08

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