Ecrire en binaire

cs_gorby69 Messages postés 48 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 10 février 2006 - 18 août 2003 à 10:36
codeurfou Messages postés 6 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 29 décembre 2008 - 12 janv. 2005 à 21:07
Salut,

J'aimerais écrire un fichier en binaire mais pas avec la commande classique:
open fichier for binary write as #1
mais en vrai binaire, avec des 0 et des 1....
est-ce possible en VB?

14 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
18 août 2003 à 11:24
VB comme tous les programmes ecrit tous les fichiers en binaire
mais utilise l'hexa pour le represente car plus facile a lire pour les etudes de trames, de binaire, ...

Il faut le faire a la main pour traduire de HEXA vers Binaire

http://www.vbfrance.com/article.aspx?Val=5575

par exemple
0
cs_gorby69 Messages postés 48 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 10 février 2006
18 août 2003 à 12:16
Voici mon problème en clair:

Je voudrais programmer un compresseur à l'aide du codage arithmétique.
Par exemple: "l'encodage" est transformé en "6944364106"
Si j'écris dans un fichier txt "l'encodage" ou "6944364106", j'aurais dans les deux cas 10 octets alors qu'au niveau du bit:
"l'encodage"=10*8bits=80 bits puisqu'un caractère=1 octet
alors que
"6944364106"=32 bits (je crois)

Donc mon fichier compressé ne doit pas être écrit conventionellement avec un 'open' je pense. Comment faire pour stocker "6944364106" en bits et pas en octet?????

J'ai pas réussi à comprendre comment s'y prenaient les autres personnes ayant écrit des compresseurs. Je crois qu'avec la méthode de Huffman, le mêm problème se pose.
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
18 août 2003 à 12:23
8-) Neodante 8-)

VB gère très mal la vraie gestion des bits !!! Je veux dire que C++ lui fonctionne vraiment avec des bits d'où les opérateurs << >> de décalage de bit et les & | ... qui servent à fonctionner au niveau des bits. Tout ce que tu peut faire en VB c'est traduite un caractère en chiffre et le mettre dans le fichier avec la commande binaire !
@+
0
cs_gorby69 Messages postés 48 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 10 février 2006
18 août 2003 à 12:44
"traduire un caractère en chiffre et le mettre dans le fichier avec la commande binaire !"

Tu veux dire stocker le code ascii du caractère sous forme de chaine dans un fichier texte avec open binary?

ou peux tu me donner un exemple stp...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
18 août 2003 à 13:10
8-) Neodante 8-)

Ce que je veux dire c'est que par exemple la chaine "255" contient 3 caractères donc 3 octets (ou byte) se traduit 11111111 en binaire. Ce que tu peux faire c'est traduire les nombre en binaire mais cela est dangereux car lors de la décompression il faut savoir que c'est un chiffre et non ou lettre (ou un groupe de lettres pour les valeurs plus grance) !
@+
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
18 août 2003 à 13:42
8-) Neodante 8-)

Quel système de compression veux-tu implémenter hauffman ?
@+
0
cs_gorby69 Messages postés 48 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 10 février 2006
18 août 2003 à 14:14
je veux faire du codage arithmétique.

Convertir un décimal en binaire, je sais faire sans problème.
Mon problème c'est comment écrire dans mon fichier "11111111" en bits et non l'écrire comme huit octets c'est à dire 8 caractères.
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
18 août 2003 à 14:26
8-) Neodante 8-)

Tout est stocké en bits dans un fichier donc 11111111 sera écrit dans ton fichier si tu inscrit la valeur 255 sur un byte -> 1 octet !!!
@+
0
cs_gorby69 Messages postés 48 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 10 février 2006
18 août 2003 à 14:53
si je te suis bien pour stocker en binaire "1100" il faut que je fasse
put #1, ,"12"

Merci de t'occuper de moi en tout cas...
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
18 août 2003 à 18:18
8-) Neodante 8-)

> put #1, ,"12"
non justement pas de chaîne de caractère "12" mais la valeur 12 tout simplement. Normalement cela devrait marcher.
> Merci de t'occuper de moi en tout cas...
Y a pas de quoi !!
@+

Je te joins quand même l'extrait de MSDN :

--------------------------------------------------------------------

Put, instruction


Écrit les données d'unevariable dans un fichier disque.

Syntaxe

Put [#]filenumber, [recnumber], varname

La syntaxe de l'instruction Put comprend les éléments suivants :

Élément Description
filenumber Toutnuméro de fichier valide.
recnumber Facultatif. Donnée de type Variant (Long). Numéro de l'enregistrement (fichiers ouverts en mode Random) ou de l'octet (fichiers ouverts en mode Binary) qui marque le début de l'écriture.
varname Nom de la variable contenant les données à écrire sur le disque.

Remarques

Les données écrites à l'aide de l'instruction Put sont généralement lues dans un fichier avec l'instruction Get.

Le premier enregistrement ou octet d'un fichier occupe la position 1, le deuxième enregistrement ou octet la position 2, et ainsi de suite. Si l'argument recnumber est omis, l'écriture commence à partir de l'enregistrement ou de l'octet suivant la dernière instruction Get ou Put (ou à partir de celui désigné par la dernière fonction Seek). Vous devez inclure des séparateurs virgules. Exemple :

Put #4,,FileBuffer

Les règles suivantes s'appliquent aux fichiers ouverts en mode Random :

Si la longueur des données écrites est inférieure à la longueur indiquée dans la clause Len de l'instruction Open, l'instruction Put poursuit l'écriture des enregistrements suivants conformément aux limites de longueur des enregistrements. L'espace compris entre la fin d'un enregistrement et le début de l'enregistrement suivant est rempli par le contenu de la zone tampon du fichier. Comme il est impossible de déterminer avec certitude le volume des données de remplissage, il est généralement préférable que la longueur des enregistrements corresponde à la longueur des données écrites. Une erreur se produit si la longueur des données écrites est supérieure à celle indiquée dans la clause Len de l'instruction Open.

Si la variable écrite est une chaîne de longueur variable, l'instruction Put écrit d'abord un descripteur de 2 octets contenant la longueur de la chaîne, puis la variable. La longueur d'enregistrement indiquée par la clause Len dans l'instruction Open doit être supérieure d'au moins 2 octets à la longueur réelle de la chaîne.

Si la variable écrite est une valeurVariant detype numérique, l'instruction Put écrit les 2 octets qui identifient le VarType de la valeur de type Variant puis la variable. Par exemple, lorsqu'elle écrit une valeur de type Variant de VarType 3, l'instruction Put écrit 6 octets : 2 octets qui identifient la valeur de type Variant comme étant de VarType 3 (Long) et 4 octets contenant les données de type Long. La longueur d'enregistrement indiquée par la clause Len dans l'instruction Open doit être supérieure d'au moins 2 octets au nombre réel d'octets requis pour stocker la variable.
Note Vous pouvez utiliser l'instruction Put pour écrire untableau de type Variant sur un disque, mais vous ne pouvez pas l'utiliser pour écrire sur disque un scalaire de type Variant contenant un tableau. Vous ne pouvez pas non plus utiliser l'instruction Put pour écrire des objets sur un disque.

Si la variable écrite est de type Variant de VarType 8 (String), l'instruction Put écrit 2 octets qui identifient le type VarType, 2 octets qui indiquent la longueur de la chaîne puis les données de la chaîne. La longueur d'enregistrement indiquée par la clause Len dans l'instruction Open doit être supérieure d'au moins 4 octets à la longueur réelle de la chaîne.

Si la variable écrite est un tableau dynamique, l'instruction Put écrit un descripteur dont la longueur est égale à 2 plus 8 fois le nombre de dimensions, soit 2 + 8 * NumberOfDimensions. La longueur d'enregistrement indiquée par la clause Len dans l'instruction Open doit être supérieure ou égale à la somme de tous les octets nécessaires à l'écriture des données et du descripteur du tableau. Par exemple, la déclaration de tableau suivante nécessite 118 octets pour l'écriture du tableau sur le disque.
Dim MyArray(1 To 5,1 To 10) As Integer

Les 118 octets se décomposent de la façon suivante : 18 octets pour le descripteur (2 + 8 * 2) et 100 octets pour les données (5 * 10 * 2).

Si la variable écrite est un tableau de taille fixe, l'instruction Put n'écrit que les données. Elle n'écrit aucun descripteur sur le disque.

Si la variable écrite est d'un type différent (pas une chaîne de longueur variable ou une valeur de type Variant), l'instruction Put n'écrit que les données de la variable. La longueur d'enregistrement indiquée par la clause Len dans l'instruction Open doit être supérieure ou égale à la longueur des données écrites.

L'instruction Put écrit des éléments detypes définis par l'utilisateur comme si chacun d'eux était écrit de façon individuelle, à la différence près qu'il n'y a pas de remplissage entre les éléments. Sur disque, un tableau dynamique de type défini par l'utilisateur écrit avec l'instruction Put est préfixé par un descripteur dont la longueur est égale à 2 plus 8 fois le nombre de dimensions, soit 2 + 8 * NumberOfDimensions. La longueur d'enregistrement indiquée par la clause Len dans l'instruction Open doit être supérieure ou égale à la somme de tous les octets nécessaires à l'écriture des éléments individuels, y compris les tableaux et leurs descripteurs.
Pour les fichiers ouverts en mode Binary, toutes les règles du mode Random s'appliquent, aux exceptions suivantes :

La clause Len dans l'instruction Open n'a aucun effet. L'instruction Put écrit toutes les variables sur le disque de manière contiguë, c'est-à-dire sans remplissage entre les enregistrements.

Pour tout tableau autre que ceux de type défini par l'utilisateur, l'instruction Put n'écrit que les données. Elle n'écrit aucun descripteur.

L'instruction Put écrit les chaînes de longueur variable qui ne sont pas des éléments de type défini par l'utilisateur, sans rechercher le descripteur de 2 octets. Le nombre d'octets écrits est égal au nombre de caractères de la chaîne. Par exemple, les instructions suivantes écrivent 10 octets dans le fichier numéro 1 :
VarString$ = String$(10," ")
Put #1,,VarString$
0
cs_gorby69 Messages postés 48 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 10 février 2006
19 août 2003 à 10:35
Encore une ptite question,

J'ai pas bien compris dans msdn,
dim a as byte
a=12
put #1, ,a
dans mon fichier il va écrire juste 1100 ou 00001100 ??
puisque a est un octet...
0
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
19 août 2003 à 12:20
8-) Neodante 8-)
Il va écrire 00001100 puisque un byte un octet et un octet 8 bits !
@+
0
Trollien Messages postés 39 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 31 janvier 2006
14 nov. 2003 à 22:13
Une solution possible si tu cherches tjr, c d'utiliser un tableau de long ( pour pas se prendre la tête ) de 256 lignes et d'y mettre t puissance de deux, je m'explique :

Dim tPuissance2(0 To 255) as Long
Dim i as Integer

For i = 0 To 255
tPuissance2(i) = 2 ^ i
Next

Ensuite imaginons une valeur binaire (pas forcement un octet mais peut êtres 2 Octets + 4Bits) :

Dim test as String
Dim cpt as Integer
Dim toWrite as Byte

test = "111000110011"
cpt = 0

For i = 1 To Len(test)
toWrite = toWrite + CByte( Val(Mid$(test,i,1)) * tPuissance2(cpt) )
If ( cpt = 7 )
'Ecrire le byte
Put #nfl , , toWrite
cpt = 0
toWrite = 0
Else
cpt = cpt + 1
End If
Next

Voilou il me semble que c ce que tu veux faire à peu près.
0
codeurfou Messages postés 6 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 29 décembre 2008
12 janv. 2005 à 21:07
j avais fais un (vieux ) code la dessus le principe etais de gerrer un buffer de bits et de les stocker par 8 en bytes

on appelais la fonction avec le chifre a coder , et le nombre de bits dediés, (avec prevention de l utilisateur si le chifre ne pouvais etre codé avec les bits demandé 260 sur 8 bits par example mais possible sur 9 !!!

le tout stoqué arondis au byte a la fin

pour la relecture il suffis de demander a lire un certain nombre de bits pour relire le fichier source (on est censé savoir ce qu il y as a lire dans un fichier binaire donc ca roule )

je retrouve plus ce code mais il n est pas compliquer a prog (le plus dur c le buffer et la conv en bits )

au final permet de coder 2 fois 4 bits par example sur 1 byte :) c le but non ? a condition de relire 2*4 bits ....

le codeur fou !!
0
Rejoignez-nous