Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

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 : 7 032

Note :
Aucune note

Commentaire sur cette source (1)
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 :
.

Commentaires et avis

signaler à un administrateur
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

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 [C# 2.0] Le Binaire [ par iow4 ] Bonjour, j'aimerais pouvoir lire entierement tout le code binaire d'un fichier exe et le reécrire dans un autre fichier ( le cloner ou le generer ) Se personnaliser datagrid avec image binaire [ par lolo70000 ] Salut tt le monde !je veux personnaliser mon datagrid en affichant tous les champs de ma table y compris un champ image stocke en binaire au niveau de Bitmap en binaire [ par Captain_Bomber ] Bonjour tout le monde!!! J'ai un ch'tit problème là: Je dois faire une appli client-serveur qui permet de dessiner des formes sur une picturebox et q enregistrement fichier binaire [ par ddove53 ] Salut,je veux enregistrer un fichier binaire je fais par exemple:SaveFileDialog saveFileDialog1 = new</font Ecrire en binaire à un offset précis dans un .exe ou .dll [ par clubberzZ ] Bonjour à tous,J'aimerais transfomer ce code vb.net en c# mais je ne trouve aucune alternative (désolé je suis débutant).Merci d'avance pour vos répon Operation binaire [ par drcmomo ] Bonjour tout le monde J'ai un tableau qui contient les donnees suivantes <font size Serialisation XML d'un byte dans un fichier au format hexa ? [ par billou_13 ] Bonjour, bonjour ^^ Une t'chite question en ce beau mois d'Août qui ne devrait pas être si terrible que ça à résoudre. J'ai un objet classique com fonction binaire [ par machigan ] Bonjour,Je souhaiterais tracer une série de 1 et 0 que je possède dans un tableau avec zedgraph et je ne sais pas comment procéder. Merci d'avance. Affichage code binaire [ par Francks11 ] Bonjour, Voila mon problème : Dans l'active directory, j'aimerai récuperer le objectSid qui est un attribut binaire.Le contenu du champ est de cet


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.