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
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|