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

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

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.