begin process at 2012 02 11 10:53:20
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > LIRE LES BITS D'UN FICHIER ET CRÉER UN FICHIER À PARTIR DE BITS

LIRE LES BITS D'UN FICHIER ET CRÉER UN FICHIER À PARTIR DE BITS


 Information sur la source

Note :
Aucune note
Catégorie :Fichiers / Disque Source .NET ( DotNet ) Classé sous :bit, octet, transposeur, visionneur, binaire Niveau :Débutant Date de création :08/10/2006 Date de mise à jour :08/10/2006 23:35:11 Vu :10 474

Auteur : taupe4

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

 Description

C'est un truc simple que j'avais développé pour commencer mon truc de lectures de cartes imprimées (transposage de bits sur une image pour récupération via un scanner, à la manière des antiques cartes perforées). Je devais trouver comment extraire les 8 bits d'un octet facilement, et je devais aussi pouvoir composer des octets à partir de bits. Chose qui était à l'époque difficile ... Je n'avais même pas de scanner, donc je devais aussi pouvoir entrer les bits moi-même et recomposer le fichier.


J'ai commenté cette source pour les débutants, il s'agit d'une source simple sans prétention.

Source

  • // Créé par David L.Pratte <Mykeys Admin>
  • using System;
  • using System.IO;
  • using System.Windows.Forms;
  • using System.Text.RegularExpressions;
  • namespace PTS
  • {
  • /// <summary>
  • /// Classe de test de lecture/écriture de trucs binaires ;)
  • /// </summary>
  • public class BinController
  • {
  • /// <summary>
  • /// Lit les bits et retourne une chaîne de caractères.
  • /// Les bits sont regroupés en groupe de 8 pour une meilleure lisibilité
  • /// </summary>
  • /// <param name="fichier">Le fichier à lire</param>
  • /// <returns>Les bits en forme de chaîne de caractère</returns>
  • public static string BitsRead(FileInfo fichier){
  • //Si le fichier existe
  • if (fichier.Exists){
  • //Variable qui servira à insérer les bits
  • string bits = "";
  • //Ouverture du fichier en lecture (création d'un flux)
  • FileStream fluxFichier = fichier.OpenRead();
  • //Le lecteur binaire pour la lecture simple du flux
  • BinaryReader lecteurBinaire = new BinaryReader(fluxFichier);
  • //Tant qu'il reste des données dans le fichier
  • while(lecteurBinaire.PeekChar() != -1){
  • //On lit l'octet (8 bits)
  • byte b = lecteurBinaire.ReadByte();
  • /* On passe tous les bits dans l'octet. Un octet se constitue ainsi: 01100110 (tous les bits peuvent être 0 ou 1)
  • * Un bits peut prendre 2 valeurs, 0 et 1
  • * les puissances de 2 sont donc utilisés pour composer l'octet:
  • * 0 = 0 x 2^7 = 0
  • *+1 = 1 x 2^6 = 64
  • *+1 = 1 x 2^5 = 32
  • *+0 = 0 x 2^4 = 0
  • *+0 = 0 x 2^3 = 0
  • *+1 = 1 x 2^2 = 4
  • *+1 = 1 x 2^1 = 2
  • *+0 = 0 x 2^0 = 0
  • * Ce qui donne donc le nombre 102 exprimé en binaire
  • * Le bit le plus important se situe à l'extrême gauche, puisque c'est celui qui peut atteindre la plus grande valeur (2^7 , c'est à dire 128)
  • * ----
  • * L'opérateur << sert à décaler les bits
  • * 1 << 3, par exemple, donne ceci:
  • * 1 en binaire = 1
  • * décalage de 3 positions = 1000, c'est à dire 16 dans notre manière de compter
  • * en décalant 1 de i positions, on obtient donc 2^i
  • * ---
  • * L'opérateur & (x & y) sert à dire à l'ordinateur : Mets 1 dans les bits du résultat ou les bits sont à 1 dans x et dans y
  • * Exemple:
  • * 102 & 16
  • * 102 = 01100110
  • * 16 = 00001000
  • * REP = 00000000 (aucun bit n'est identique)
  • * Ce qui donnera 0
  • *
  • * Exemple 2:
  • * 102 & 63
  • * 102 = 01100110
  • * 63 = 00111111
  • * REP = 00100110
  • * Ce qui donnera 38
  • *
  • * En testant avec 2^i, les résultats possibles seront donc 0 (bit à 0) ou 2^i (bit à 1)
  • * L'exploitation de ces résultats permet de conserver les bits */
  • for (sbyte i=7;i>=0;i--){
  • bits += (((b & 1<<i) > 0)?1:0).ToString();
  • }
  • bits+=" ";
  • }
  • //on ferme le fichier
  • fluxFichier.Close();
  • return bits;
  • }
  • return "";
  • }
  • public static void BitsWrite(string bits,FileInfo fichier){
  • //Cette RegEx vérifie qu'il y a une chaîne de 0 et de 1 ([0-1]+) du début de la chaîne(^) à la fin($)
  • Regex rgx = new Regex("^[0-1]+$");
  • //On enlève les espaces
  • bits = bits.Replace(" ","");
  • //Si la chaîne est une suite de 0 et de 1 et qu'on a donné un nom de fichier
  • if (rgx.IsMatch(bits) && fichier.FullName != ""){
  • //On ouvre le fichier pour pouvoir écrire dedans
  • FileStream fluxFichier = fichier.OpenWrite();
  • //On crée un écriveur pour traiter facilement le flux
  • BinaryWriter ecriveurBinaire = new BinaryWriter(fluxFichier);
  • //Tant qu'il y a des groupes de 8 bits
  • for(int i = 0;i<bits.Length;i+=8){
  • //on crée une variable qui contiendra notre octet
  • byte buffer=0;
  • //on passe chaque bit de l'octet
  • for (byte n=0;n<=7;n++){
  • //on parse le bit qu'on veut dans la chaîne et on lui applique son importance (2^n) et on additionne ça dans l'octet
  • buffer += (byte)(byte.Parse(bits[i+n].ToString()) << (7-n));
  • }
  • //on écrit l'octet dans le fichier
  • ecriveurBinaire.Write(buffer);
  • }
  • //on ferme le fichier
  • fluxFichier.Close();
  • }
  • }
  • }
  • }
// Créé par David L.Pratte <Mykeys Admin>

using System;
using System.IO;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace PTS
{
	/// <summary>
	/// Classe de test de lecture/écriture de trucs binaires ;)
	/// </summary>
	public class BinController
	{
	  /// <summary>
	  /// Lit les bits et retourne une chaîne de caractères.
	  /// Les bits sont regroupés en groupe de 8 pour une meilleure lisibilité
	  /// </summary>
	  /// <param name="fichier">Le fichier à lire</param>
	  /// <returns>Les bits en forme de chaîne de caractère</returns>
	  public static string BitsRead(FileInfo fichier){
	    //Si le fichier existe
	    if (fichier.Exists){
	      //Variable qui servira à insérer les bits
	      string bits = "";
	      //Ouverture du fichier en lecture (création d'un flux)
	      FileStream fluxFichier = fichier.OpenRead();
	      //Le lecteur binaire pour la lecture simple du flux
	      BinaryReader lecteurBinaire = new BinaryReader(fluxFichier);
	      //Tant qu'il reste des données dans le fichier
	      while(lecteurBinaire.PeekChar() != -1){
	        //On lit l'octet (8 bits)
	        byte b = lecteurBinaire.ReadByte();
	        /* On passe tous les bits dans l'octet. Un octet se constitue ainsi: 01100110 (tous les bits peuvent être 0 ou 1)
	         * Un bits peut prendre 2 valeurs, 0 et 1
	         * les puissances de 2 sont donc utilisés pour composer l'octet:
	         * 0 = 0 x 2^7 = 0
	         *+1 = 1 x 2^6 = 64
	         *+1 = 1 x 2^5 = 32
	         *+0 = 0 x 2^4 = 0
	         *+0 = 0 x 2^3 = 0
	         *+1 = 1 x 2^2 = 4
	         *+1 = 1 x 2^1 = 2
	         *+0 = 0 x 2^0 = 0
	         * Ce qui donne donc le nombre 102 exprimé en binaire
	         * Le bit le plus important se situe à l'extrême gauche, puisque c'est celui qui peut atteindre la plus grande valeur (2^7 , c'est à dire 128)
	         * ----
	         * L'opérateur << sert à décaler les bits
	         * 1 << 3, par exemple, donne ceci:
	         * 1 en binaire = 1
	         * décalage de 3 positions = 1000, c'est à dire 16 dans notre manière de compter
	         * en décalant 1 de i positions, on obtient donc 2^i
	         * ---
	         * L'opérateur & (x & y) sert à dire à l'ordinateur : Mets 1 dans les bits du résultat ou les bits sont à 1 dans x et dans y
	         * Exemple:
	         * 102 & 16
	         * 102 = 01100110
	         * 16  = 00001000
	         * REP = 00000000 (aucun bit n'est identique)
	         * Ce qui donnera 0
	         * 
	         * Exemple 2:
	         * 102 & 63
	         * 102 = 01100110
	         * 63  = 00111111
	         * REP = 00100110
	         * Ce qui donnera 38
	         * 
	         * En testant avec 2^i, les résultats possibles seront donc 0 (bit à 0) ou 2^i (bit à 1)
	         * L'exploitation de ces résultats permet de conserver les bits */
	        for (sbyte i=7;i>=0;i--){
	          bits += (((b & 1<<i) > 0)?1:0).ToString();
	        }
	        bits+=" ";
	      }
	      //on ferme le fichier
	      fluxFichier.Close();
	      return bits;
	    }
	    return "";
	  }
	  
	  public static void BitsWrite(string bits,FileInfo fichier){
	    //Cette RegEx vérifie qu'il y a une chaîne de 0 et de 1 ([0-1]+) du début de la chaîne(^) à la fin($)
	    Regex rgx = new Regex("^[0-1]+$");
	    
	    //On enlève les espaces
	    bits = bits.Replace(" ","");
	    //Si la chaîne est une suite de 0 et de 1 et qu'on a donné un nom de fichier
	    if (rgx.IsMatch(bits) && fichier.FullName != ""){
	      //On ouvre le fichier pour pouvoir écrire dedans
	      FileStream fluxFichier = fichier.OpenWrite();
	      //On crée un écriveur pour traiter facilement le flux
	      BinaryWriter ecriveurBinaire = new BinaryWriter(fluxFichier);
	      //Tant qu'il y a des groupes de 8 bits
	      for(int i = 0;i<bits.Length;i+=8){
	        //on crée une variable qui contiendra notre octet
	        byte buffer=0;
	        //on passe chaque bit de l'octet
	        for (byte n=0;n<=7;n++){
	          //on parse le bit qu'on veut dans la chaîne et on lui applique son importance (2^n) et on additionne ça dans l'octet
	          buffer += (byte)(byte.Parse(bits[i+n].ToString()) << (7-n));
	        }
	        //on écrit l'octet dans le fichier
	        ecriveurBinaire.Write(buffer);
	      }
	      //on ferme le fichier
	      fluxFichier.Close();
	    }
	  }
	}
}

 Conclusion

J'ai jamais été bon pour décrire les trucs, donc, si vous avez une meilleure façon de décrire la structure d'un octet et les opérateurs & et <<, je suis preneur.


 Historique

08 octobre 2006 22:05:31 :
Changement de catégorie
08 octobre 2006 23:35:11 :
.

 Sources du même auteur

Source avec Zip Source .NET (Dotnet) INSTANCE UNIQUE + COMMUNICATION DE MESSAGES (COMPATIBLE 32 E...
Source avec Zip Source avec une capture Source .NET (Dotnet) TRAITEMENT D'IMAGES EN MASSE
Source avec Zip Source avec une capture Source .NET (Dotnet) COMPOSANT HORLOGE ANALOGIQUE PERSONNALISABLE

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) EXPLORATEUR DE DOSSIERS ET FICHIERS par Yanith
Source avec Zip Source avec une capture Source .NET (Dotnet) ZIP-UNZIP AVEC SHARPZIPLIB par buno
Source avec Zip Source .NET (Dotnet) SUPER COPIER par casseur
Source .NET (Dotnet) SERIALIZATION/DESERIALIZATION COMPLÈTE DE CLASSES par DedeSurf
Source avec Zip CONVERSION DE FICHIERS FORTRAN 77 EN FORTRAN 95 par deadhand

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) PRIORITY QUEUE par Bidou
Source .NET (Dotnet) CONVERSION ASCII-8 - BINAIRE par badrbadr
Source avec Zip Source .NET (Dotnet) CONVERTISSEUR DÉCIMAL/BINAIRE/HEXADÉCIMAL par wererabbit
Source avec Zip Source .NET (Dotnet) INSERTION ET RÉCUPERATION D'UNE IMAGE EN BASE DE DONNÉES par MorpionMx
Source avec Zip Source avec une capture Source .NET (Dotnet) CONVERTISSEUR DE NOMBRES HEXADÉCIMAUX par thebigboss

Commentaires et avis

Commentaire de glJarod le 01/11/2006 12:49:36

Voici un code qui me sera très utile ...
Je cherche la possibilité d'éditer des fichiers non-texte pour modifier des noms de clients à l'intérieur, sans changer le reste du fichier ...
Merci beaucoup

Commentaire de biga1 le 26/08/2009 20:03:37

est-cque je peux si jveux visionner ces images.si oui alors c presque cqj cherche

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Multiplication binaire en CSharp [ par alphabh ] Salut,En fait je programme en CSharp et je veux r&#233;cup&#233;rer le r&#233;sultat d'une multiplication binaire (pas vrai ou faux mais plut&#244;t l swap bit d'un octet [ par michlemer ] BonjourEst-ce qu'il y naurait une instruction C# pour "swapper" les bits d'un octet?Le bit 0 doit passer en position 7 et vis-versa puis bit 1 ... M image en matrice binaire [ par developpeur222 ] Bonjour,Dans un programme de détection d'images, j'ai besoin de convertir une image bmp en une matrice binaire. Le code doit être écrit en c.HELP ME!! Transformer jpg en octet : System.Drawing.Bitmap => Byte[] [ par Raph04 ] Bonjour, Je suis en train d'essayer d'utiliser une librairie de streaming. Cela consiste en l'envoie et réception de packets selon le protocole RTP/R Fichiers au format binaire en C++ / C# [ par platon179 ] Bonjour, Y a-t-il un moyen d'écrire des fichiers au format binaire en C++ (ifstream &amp; ofstream) et de les lire en C# (BinaryReader &amp; BinaryWri Fichier Binaire et Types, question tres simple [ par CodeIX ] Bonjour, j'ai une questions tres simple. Voila je fait un programme dans lequel je doit ecrit dans un fichier binaire le contenu de textbox. Voila Création / Gestion de fichiers Binaire [ par StormXI ] Salut ! Alors, j'essaie de créer un fichier binaire contenant : - 1 Xml - plusieurs Bitmap - 1 Liste Seulement j'arrive à rien ! (mes différent code Bit de Bourage ??? [ par theflayer ] Bonjour à tous . Çà fait un moment que je suis sur un petit programme, et on ma déjà pas mal aidé ici ( un grand merci), et ça y est je coince ! Je c SetWindowsHookEx & Windows 7 64 bit [ par Dugnouf ] Salut, j'ai développé un programme qui intercepte des touches claviers pour en envoyer des autres. Il tourne très bien sur Windows XP 32 bit. Par con


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 5,039 sec (3)

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