Accueil > > > CALCUL DU CRC32 A TRAVERS UN SYSTEM.IO.STREAM
CALCUL DU CRC32 A TRAVERS UN SYSTEM.IO.STREAM
Information sur la source
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
Sources de la même categorie
Commentaires et avis
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ées multimé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
|
Derniers Blogs
[TECHDAYS2012] OUI J'Y SERAI![TECHDAYS2012] OUI J'Y SERAI! par JeremyJeanson
Bonsoir, Certes, je l'annonce avec un peu de retard, mais je serai effectivement au Techdays demain. Comme l'an dernier, je participerai au programme ATE (Ask The Expert). Si vous avez des questions Workflow, WCF, AppFabric ou plus généralement .net, n'hé...
Cliquez pour lire la suite de l'article par JeremyJeanson TFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICESTFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICES par vfabing
Afin de s'assurer du bon fonctionnement des différentes synchronisations effectuées par les TFS Integration Tools, 2 rapports sont présents dès l'installation. Il suffit alors d'effectuer les manipulations suivantes pour pouvoir les visualiser : Loca...
Cliquez pour lire la suite de l'article par vfabing CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|