Classe read/write bit à bit dans un fichier à n'importe quelle position du bit

Soyez le premier à donner votre avis sur cette source.

Vue 9 779 fois - Téléchargée 400 fois

Description

Introduction de la source :

Quand on programme en .NET il existe une classe IO.FileStream qui permet à partir d'un flux d'écrire ou de lire des tableaux d'octets. L'inconvénient pour moi est justement de lire les octets seulement: on se trouve très vite limité. Comme je travaille en ce moment sur les algorithmes de programmation, il m'a été fastidieux de perdre mon temps à mettre en place des systèmes complexes qui m'ont finalement brouillé. D'où l'idée de créer cette classe.

Présentation de la classe :

Cette classe fonctionne quasiment comme la classe mentionée precédemment. Elle agit au niveau des bits. Ainsi on écrit dans le fichier non plus avec un tableau d'octet mais avec un tableau de bits (je précise que le bit est stocké dans un octet sous la valeur 1 ou 0 car l'octet est la plus petite information admise pour un ordinateur). Les exemples seront plus parlants.

Nous avons les octets dans un fichier quelconque :

11110001 10101110 01101000 00010100 octets

1 2 3 4 Position dans un flux de la classe .NET

12345678 9... Position dans un flux de ma classe

Ainsi on peut insérer la valeur 10100 à partir de la position 15 sans modifier les bits précédents ou suivants. Les bits écrit remplacent ceux déjà présent ou rajoute si l'on se trouve à la fin du flux. La lecture fonctionne de la même façon.

Implémentation :

Ceci est un exemple de copie d'un fichier. Ceci ne sert à rien, la classe de .NET est beaucoup plus performante car elle évite les calculs pour le même résultat. Ce code a pour but de montrer comment utiliser la classe. Son utilisation est destinée essentiellement pour
les algos de compression, de cryptage ou autres manipulations.

Dim StreamIn As New IO.FileStream("c:\1.jpg", IO.FileMode.Open, IO.FileAccess.ReadWrite)
Dim StreamOut As New IO.FileStream("c:\2.jpg", IO.FileMode.Create, IO.FileAccess.ReadWrite)

Dim BitStreamIn As New ClassBit(StreamIn)
Dim BitStreamout As New ClassBit(StreamOut)

Dim Tblbits(1023) As Byte
Do While Tblbits.Length = 1024
BitStreamIn.ReadBits(Tblbits, 0, 1024)
BitStreamout.WriteBits(Tblbits, 0, Tblbits.Length)
Loop

StreamIn.Close()
StreamOut.Close()
BitStreamIn.Close()
BitStreamout.Close()

Les seules différences avec la classe de .net réside dans le fait que ReadBits ne retourne pas de valeur Integer
qui est censé indiqué le nombre max d'octets lus. Dans ma classe c'est TblBits qui peu changer de longueur, ici en
fin de fichier TblBits.Length peut passer de 1024 à 32 par exemple. Enfin le flux créer avec l'instance New demande
un Flux Io.FileStream avec les valeurs ReadWrite quoique qu'il arrive.

Cas particuliers :

-Si le fichier est vide est que vous positionner le pointeur à 4, la lecture commencera à 0 quand même.
-Si le nombre de bits inférieur à 8 est à écrire : bits à ecrire en fin de flux pour terminer : 1011, écrit : 10110000
-Voir le code des propriétés (exemple Position>Length implique Position = Length).

Plus :

La classe contient d'autres procédures permétant de transformer des valeurs décimales en binaires ou inversement et BytesToBits/BitsToBytes.

Note :

J'éspère que cette classe fera le bonheur de certain et j'attend de vous non pas des critiques que l'on trouve habituellement "c'est beau","ca marche pas", "ca sert à rien" mais des critiques plus constructives si mon code vous pose un problème. Merci

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
561
Date d'inscription
samedi 10 janvier 2004
Statut
Membre
Dernière intervention
11 octobre 2010

Pour répondre à Willi :

-On écrase si on ne se trouve pas à la fin du fichier sinon on écrit puis il n'y a rien à remplacer. Par exemple :
11100001 on insére 101 à la position 3 et on obtient 11110101. Si la fin du fichier est atteinte il y a juste à écrire à la suite.

Cas particulier :
On commence à 0 au lieu de 4 car il n'est pas question d'insérer des 0 entre la fin du fichier et la position demandée. Cela fausserait les valeurs stockées.


Enfin pourquoi 10110000 et pas 00001011. Car les bits que l'on écrit ne sont pas des octets mais des bits donc on commence à écrire à la position la plus faible. On ne parle plus d'octets dans cette classe. Ensuite on pourra écrire en 4ème position la suite (si l'on se trouve dans une boucle) 10110101.
Messages postés
1221
Date d'inscription
jeudi 23 août 2001
Statut
Membre
Dernière intervention
9 septembre 2018

Ca ne serait pas mieux d'utiliser une structure de champ de bits sérialisable de façon classique ? Comme ça tu aurais à la fois les fonctions classiques de sérialisation de .Net et quand même l'accès à chaque bit. Lorsque je relis ta phrase "Comme je travaille en ce moment sur les algorithmes de programmation, il m'a été fastidieux de perdre mon temps à mettre en place des systèmes complexes qui m'ont finalement brouillé. D'où l'idée de créer cette classe", je n'en retire strictement aucun argument, pas le moindre bit d'information quand à la nécessité qu'il y aurait d'accéder à chaque bit, tu devrais expliciter un peu. Par exemple, si tu veux manipuler les couleurs de pixel, les champs de bits te permettent d'accéder, au choix, à chaque composante RVB indépendamment, ou bien au code couleur directement.
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
20
"Ainsi on peut insérer la valeur 10100 à partir de la position 15 sans modifier les bits précédents ou suivants. Les bits écrit remplacent ceux déjà présent où rajoute si l'on se trouve à la fin du flux."
=> Alors on écrase ou pas ? c'est ambigüe ton explication :)

Cas particuliers :

-Si le fichier est vide est que vous positionner le pointeur à 4, la lecture commencera à 0 quand même.
=>Pourquoi ne pas insérer 4 octets à 0 ou une autre valeur par exemple un espace (choix de l'utilisateur) ?
-Si le nombre de bits inférieur à 8 est à écrire : bits à ecrire en fin de flux pour terminer : 1011, écrit : 10110000
=>Pourquoi 1011 devient 10110000 et pas plutot 00001011 ? Pour moi 1011 correspond à 0000 1011.

++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.