begin process at 2010 02 10 01:16:38
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > CALCUL DU CRC32 A TRAVERS UN SYSTEM.IO.STREAM

CALCUL DU CRC32 A TRAVERS UN SYSTEM.IO.STREAM


 Information sur la source

Note :
Aucune note
Catégorie :Fichiers / Disque Source .NET ( DotNet ) Classé sous :crc32, fichier, stream Niveau :Débutant Date de création :26/08/2007 Date de mise à jour :26/08/2007 13:04:57 Vu :6 369

Auteur : Vince_02

Ecrire un message privé
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

 Description

Le calcul du CRC32 est basé sur la source :
http://www.csharpfr.com/codes/CRC32-COMPATIBLE-W INRAR-WINZIP-BASE-SUR-CODE-CPLUSPLUS_29137.aspx

L a seul différence est que dans cette class, j'implémente System.IO.Stream de sorte a connaitre soit
en fin de lecture ou écriture le CRC32 du stream de manière 'transparente'.

Exemple de fonctionnement :

// Lecture
CrcStream csRead = new CrcStream(new FileStream("C:\mon_fichier.xml", FileMode.Open, FileAccess.Read));
byte[] buf = new byte[cs.Length];
cs.Read(buf, 0, buf.Length);
csRead.Close();

// Ecriture
CrcStream csWrite = new CrcStream(new FileStream("C:\mon_fichier_backup.xml", FileMode.OpenOrCreate, FileAccess.Write));
csWrite.Write(buf, 0, buf.Length);
csWrite.Close();

// Vérif du crc
if (csRead.GetCRC32 == csWrite.GetCRC32)
   // la copie s'est bien déroullé ^^
else
   // Change ton disque dure ^^'

Dite moi ce que vous en pensez, pour la note, c'est inutile j'ai juste adapté, remerciez plutôt li9.

Voilà, voilà en espérant que ça vous plaise ^^

Source

  • using System;
  • using System.Collections.Generic;
  • using System.IO;
  • using System.Text;
  • namespace CRC32
  • {
  • class CrcStream : Stream
  • {
  • private Stream stream;
  • #region Calcul du CRC32
  • /**
  • * Calcul du CRC32 basé sur le code :
  • * http://www.csharpfr.com/codes/CRC32-COMPATIBLE-WINRAR-WINZIP-BASE-SUR-CODE-CPLUSPLUS_29137.aspx
  • *
  • * Pour un CRC32 exact du fichier, utilisez votre stream soit en Lecture, soit en Ecriture, mais pas les deux.
  • * Le CRC32 sera incorrect si vous utilisez votre Stream en Lecture/Ecriture.
  • **/
  • uint[] LookUpTable = new uint[ 256 ];
  • uint poly = 0xEDB88320;
  • uint crc32 = 0xFFFFFFFF;
  • /*
  • * Génération de la table
  • */
  • private void Init()
  • {
  • uint val;
  • for (uint i = 0; i <= 0xFF; ++i)
  • {
  • val = i;
  • for (int j = 8; j > 0; --j)
  • {
  • //Capa6T , dans sa source faisait une comparaison booleene
  • // en calculant val & 1 qui donne 1 ou 0 donc true ou false en C++
  • //or en C# on ne peut plus utiliser 1 et 0 (ni -1 d ailleurs) pour faire une comparaison booleene
  • // ** c etait juste une petite note ^^ **
  • if ((val & 1) == 1)
  • {
  • val = (val >> 1) ^ poly; // <-- la j'ai un peu compresse l equation, mais ca passe hehe : )
  • }
  • else
  • val >>= 1;
  • }
  • LookUpTable[i] = val; // on stock le resultat dans notre table.
  • }
  • }
  • /*
  • * Génère le crc32 d'un tableau de byte utilisé avec la méthode Read et Write.
  • */
  • private uint GetCRC32(byte[] b, int offset, int count)
  • {
  • for (int y = 0; y < count; y++)
  • {
  • crc32 = (crc32 >> 8) ^ LookUpTable[(crc32 & 0xFF) ^ b[offset + y]];
  • }
  • return crc32 ^ 0xFFFFFFFF;
  • }
  • /*
  • * Génère le crc32 d'un byte obtenue avec la méthode ReadByte et WriteByte.
  • */
  • private uint GetCRC32(byte b)
  • {
  • crc32 = (crc32 >> 8) ^ LookUpTable[(crc32 & 0xFF) ^ b];
  • return crc32 ^ 0xFFFFFFFF;
  • }
  • #endregion
  • /// <summary>
  • /// Retourne le CRC32 courant du stream.
  • /// Pour une représentation textuelle, utilisé <c>ToString("X")</c>
  • /// </summary>
  • public UInt32 CRC32
  • {
  • get { return crc32; }
  • }
  • public CrcStream(Stream stream)
  • {
  • Init();
  • this.stream = stream;
  • }
  • public override bool CanRead { get { return stream.CanRead; } }
  • public override bool CanTimeout { get { return stream.CanTimeout; } }
  • public override bool CanSeek { get { return stream.CanSeek; } }
  • public override bool CanWrite { get { return stream.CanWrite; } }
  • public override long Length { get { return stream.Length; } }
  • public override long Position
  • {
  • get { return stream.Position; }
  • set { stream.Position = value; }
  • }
  • public override void Flush()
  • {
  • stream.Flush();
  • }
  • public override long Seek(long offset, SeekOrigin origin)
  • {
  • return stream.Seek(offset, origin);
  • }
  • public override void SetLength(long value)
  • {
  • stream.SetLength(value);
  • }
  • public override int Read(byte[] buffer, int offset, int count)
  • {
  • // On lit d'abord le buffer,
  • // v correspond au nombre de byte lue.
  • int v = stream.Read(buffer, offset, count);
  • // notre buffer est remplis, on a le nombre de byte lue ( v ), on peut généré notre CRC32.
  • GetCRC32(buffer, offset, v);
  • return v;
  • }
  • public override int ReadByte()
  • {
  • int b = stream.ReadByte();
  • GetCRC32((byte)b);
  • return b;
  • }
  • public override void Write(byte[] buffer, int offset, int count)
  • {
  • stream.Write(buffer, offset, count);
  • GetCRC32(buffer, offset, count);
  • }
  • public override void WriteByte(byte value)
  • {
  • stream.WriteByte(value);
  • GetCRC32(value);
  • }
  • public override void Close()
  • {
  • stream.Close();
  • base.Close();
  • }
  • }
  • }
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace CRC32
{
    class CrcStream : Stream
    {
        private Stream stream;

        #region Calcul du CRC32

        /**
         * Calcul du CRC32 basé sur le code :
         * http://www.csharpfr.com/codes/CRC32-COMPATIBLE-WINRAR-WINZIP-BASE-SUR-CODE-CPLUSPLUS_29137.aspx
         * 
         * Pour un CRC32 exact du fichier, utilisez votre stream soit en Lecture, soit en Ecriture, mais pas les deux.
         * Le CRC32 sera incorrect si vous utilisez votre Stream en Lecture/Ecriture.
         **/ 

        uint[] LookUpTable = new uint[ 256 ];
        uint poly = 0xEDB88320;
        uint crc32 = 0xFFFFFFFF;

        /*
         * Génération de la table
         */
        private void Init()
        {
            uint val;
            for (uint i = 0; i <= 0xFF; ++i)
            {
                val = i;
                for (int j = 8; j > 0; --j)
                {
                    //Capa6T , dans sa source faisait une comparaison booleene
                    // en calculant val & 1 qui donne 1 ou 0 donc true ou false en C++
                    //or en C# on ne peut plus utiliser 1 et 0 (ni -1 d ailleurs) pour faire une comparaison booleene
                    // ** c etait juste une petite note ^^ ** 
                    if ((val & 1) == 1)
                    {
                        val = (val >> 1) ^ poly; // <-- la j'ai un peu compresse l equation, mais ca passe hehe : )
                    }
                    else
                        val >>= 1;
                }
                LookUpTable[i] = val; // on stock le resultat dans notre table. 
            }
        }

        /*
         * Génère le crc32 d'un tableau de byte utilisé avec la méthode Read et Write.
         */
        private uint GetCRC32(byte[] b, int offset, int count)
        {
            for (int y = 0; y < count; y++)
            {
                crc32 = (crc32 >> 8) ^ LookUpTable[(crc32 & 0xFF) ^ b[offset + y]];
            }
            return crc32 ^ 0xFFFFFFFF;
        }

        /*
         * Génère le crc32 d'un byte obtenue avec la méthode ReadByte et WriteByte.
         */
        private uint GetCRC32(byte b)
        {
            crc32 = (crc32 >> 8) ^ LookUpTable[(crc32 & 0xFF) ^ b];
            return crc32 ^ 0xFFFFFFFF;
        }

        #endregion

        /// <summary>
        /// Retourne le CRC32 courant du stream.
        /// Pour une représentation textuelle, utilisé <c>ToString("X")</c>
        /// </summary>
        public UInt32 CRC32
        {
            get { return crc32; }
        }

        public CrcStream(Stream stream)
        {
            Init();
            this.stream = stream;
        }

        public override bool CanRead { get { return stream.CanRead; } }
        public override bool CanTimeout { get { return stream.CanTimeout; } }
        public override bool CanSeek { get { return stream.CanSeek; } }
        public override bool CanWrite { get { return stream.CanWrite; } }
        public override long Length { get { return stream.Length; } }

        public override long Position
        {
            get { return stream.Position; }
            set { stream.Position = value; }
        }

        public override void Flush()
        {
            stream.Flush();
        }

        public override long Seek(long offset, SeekOrigin origin)
        {
            return stream.Seek(offset, origin);
        }

        public override void SetLength(long value)
        {
            stream.SetLength(value);
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            // On lit d'abord le buffer,
            // v correspond au nombre de byte lue.
            int v = stream.Read(buffer, offset, count);
            // notre buffer est remplis, on a le nombre de byte lue ( v ), on peut généré notre CRC32.
            GetCRC32(buffer, offset, v);
            return v;
        }

        public override int ReadByte()
        {
            int b = stream.ReadByte();
            GetCRC32((byte)b);
            return b;
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            stream.Write(buffer, offset, count);
            GetCRC32(buffer, offset, count);
        }

        public override void WriteByte(byte value)
        {
            stream.WriteByte(value);
            GetCRC32(value);
        }

        public override void Close()
        {
            stream.Close();
            base.Close();
        }

    }
}



 Historique

26 août 2007 13:04:57 :
Correction d'une erreur du code source ( Propriété GetCRC32 faisait doublons avec les méthodes private, modifié en CRC32 )

 Sources du même auteur

Source avec Zip Source .NET (Dotnet) COMPRESSION / DECOMPRESSION A PARTIR DU SDK LZMA DE 7ZIP ( ...

 Sources de la même categorie

Source avec Zip PILOTER WORD VIA MICROSOFT.OFFICE.INTEROP.WORD par whismeril
Source avec Zip PILOTER EXCEL VIA MICROSOFT.OFFICE.INTEROP.EXCEL par whismeril
Source avec Zip Source .NET (Dotnet) CHECK IDENTICAL FILES par eldim
Source avec Zip Source avec une capture Source .NET (Dotnet) RICHTEXTBOX NUMÉROTÉ (NUMÉROS DE LIGNES) par jray
Source avec Zip Source avec une capture SURVEILLER FICHIERS CRÉÉS AVEC FILESYSTEMWATCHER AMÉLIORÉ par TheOnlyMaX

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) RECHERCHE ET GESTION DE FICHIERS PERSONNALISÉES par JeremyLecouvert
Source .NET (Dotnet) GREP POUR WINDOWS par Warny
Source avec Zip Source .NET (Dotnet) CHECK IDENTICAL FILES par eldim
Source avec Zip Source .NET (Dotnet) UN RICHTEXTBOX À PARTIR D'UN MEMORYSTREAM par Robert33
Source avec Zip Source avec une capture Source .NET (Dotnet) SUPPRIMER LES TAG BOM DANS FICHIER UTF-8 par gluk

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

ouverture/fermeture fichier LOG [ par babe59 ] Bonjour,Dans mon appli, je fais une classe pour écrire mes messages d'erreur dans un fichier texte. L'idée est que je version ces fichiers de log afin Stream pour Source ou Destination Directshow [ par cbeyls ] Avis aux experts en DirectShow: Je souhaite utiliser DirectShow afin de visualiser ou enregistrer des donn&#233;es multim&#233;dia. Le DirectX manag&# Lire un fichier binaire [ par Souliabdo ] Bonjour, J’ai un fichier .doc que j’ai stocké sous forme binaire (byte[]Mydoc) dans ma base Je voudrais savoir comment ouvrir ce fichier pour affiche Execption a l'ouverture d'un fichier [ par _Bao_ ] Salut,j'ai le meme probleme qu'avait Scoubidou (j'ai essaye son truc mais ca n'a pas marche), j'ai une exception (The process cannot access the file " obtenir la durée d'un fichier audio chargé dans un SecondaryBuffer [ par godefrw ] Bonjour, je cherche à obtenir la durée d'un fichier audio que j'ai chargé dans un secondaryBuffer avec Buffer = new SecondaryBuffer(textBox1.Text , De Lecture d'un fichier *.csv [ par sabi44 ] Bonjour,Je souhaiterais lire un fichier *.csv (avec séparateur ';') pour enregistrer les données dans une base oracle et je ne sais pas kel solution u c# envoyer un fichier XML sur un serveur [ par Salvo ] Bonjour je suis à la recherche d'un moyen pour envoyer le contenu de fichiers XML de plusieurs clients (tous avec la même structure) ver un serveur. Modification XML [ par fdouieb ] BonjourSuite à la source "http://www.csharpfr.com/code.aspx?ID=26507"qui permet de generer un fichier ".Ini". J'ai decidé de faire comme la plupart l' Lire fichier à partir d'un applet c# [ par NHV ] Bonjour,j'ai créé un applet en c# (programme qui roule du côté client dans un browser).J'aimerai savoir comment dois-je faire pour lire un fichier (.t type d'élément ajouté dans visual studio.net [ par taoetc ] Bonjour,j'ai ajouté diverses types de fichiers( fichirs de classe, winforms, et dataset)Et j'ai un phénomène bizarre: visual a tendance à modifier le


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,718 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales