|
Trouver une ressource
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
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
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
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écupérer le résultat d'une multiplication binaire (pas vrai ou faux mais plutô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 & ofstream) et de les lire en C# (BinaryReader & BinaryWri
[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
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|