Comment exploiter un fichier binaire ?

Signaler
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
-
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
-
Comment exploiter un fichier binaire (vbNet10)

Oh j'ai du mal, je ne comprends pas exactement ce qui se passe, ni ce que produisent exactement les directives, j'ai copié et arrangé un exemple qui marche, mais il n'accepte que les chiffres ...

En fait je voudrais m'en servir pour ranger des noms et mots de passe, comme suit :
NomMdpNomMdp
Le tout attaché et formaté, disons chacun sur 16 octets de saisie calée à gauche dans les variables :

Voici le code de base, il tourne lui, suite après :

Option Explicit On ' binaire form1 fichier binaire
Public Class Form1
Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim lecture As System.IO.BinaryReader = Nothing
Dim ecriture As System.IO.BinaryWriter = Nothing
Dim leflux As System.IO.FileStream = Nothing
Dim i As Integer = 0
Dim NomFichier As String = My.Application.Info.DirectoryPath & "\binaire.bin"
Dim motDePasse As String = "01234567890" ' maxi 10 entiers
Dim leNom As String = "Dupont"
Try
If Not System.IO.File.Exists(NomFichier) Then	' création
ecriture = New System.IO.BinaryWriter(System.IO.File.Create(NomFichier))
ecriture.Write(CInt(motDePasse))
ecriture.Close()
End If
leflux = System.IO.File.Open(NomFichier, System.IO.FileMode.Open)	' lecture
lecture = New System.IO.BinaryReader(leflux)
While leflux.Position < leflux.Length
TextBox1.Text = TextBox1.Text & lecture.ReadInt32()
End While
Finally	' fermeture
If Not IsNothing(lecture) Then lecture.Close()
If Not IsNothing(ecriture) Then ecriture.Close()
End Try
End Sub
End Class


Et voici le code que je cherche à faire, sans y arriver :
dim Nom as string
dim Mdp as string
'chargement
Nom = "dupont"
Mdp = "0123456789"
écrit Nom ' sur 16 octets texte collé à gauche
écrit Mdp ' sur 16 octets texte collé à gauche
Nom = "Durand"
Mdp = "98765"
écrit Nom ' sur 16 octets texte collé à gauche
écrit Mdp ' sur 16 octets texte collé à gauche
'
lit recompose Nom+Mdp position deux 
 =
"Durand          98765            "


L'idéal serait que je puisse écrire lec octets un par un, lisant mes variables dans une boucle avec un MID pour traiter la chaîne par octet, je crois qu'il y a une directive "AllBytes" que je ne sais pas utiliser.

Le problème c'est encore davantage le retour, le positionnement (fichier à données cadrées) et la lecture, car le fichier binaire ne range pas comme le fichier texte, et si par exemple je remonte 3 octes binaires, je peux me retrouver en recomposant le texte avec 2,5 octets, soit 2 octets compréhensibles, et un atrophié qui ne donnera rien en alphanumérique (exemple fictif), vous me suivez je pésume, donc comment se positionner dans mon exemple sur la seconde data NomMdp et la remonter ?


Merci beaucoup, au plaisir, cordialement.

Joe
.

6 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Pas bonjour non plus

Ce que tu appelles octet sont des bytes, au sens programmatical (c'est la même chose).
Prépare ta chaine String bien formatée avec les espaces nécessaires, puis transforme cette chaine en un tableau de bytes, puis écrit ce tableau de bytes dans ton fichier.

Par contre, que tu écrives du texte ou des bytes représentant ces caractères ne changera rien au fait qu'un simple éditeur lira sans difficulté le texte, puisque ces bytes seront des codes Ascii.
Penche-toi sur les conversions en base 64, par exemple; facile à décrypter certes, mais non visible à l'œil nu.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
5
Bonjour Jack,

Merci de ta réponse.

Désolé si j'ai oublié de dire bonjour, toi tu as oublié tes cordialités, à chacun sa peine

Oui, octet en français = byte en anglais, excellent !

Question :
- Veux-tu bien m'écrire un code qui tourne pour transformer une string en tableau de bytes ?

- Puis idem pour les ordre de lecture écriture (et positionnement d'écriture) de ce tableau de bytes ?

Mais non, un simple éditeur (notePad), ne lit pas obligatoirement les fichiers binaires, enfin, ne les lit pas pour être visuellement compréhensibles, car justement un fichier binaire tasse les valeurs qu'il reçoit en les codant de façon différente, on y voit des signes habituellement non visibls, comme des valeurs ascii inférieurs à 32.
Par exemple j'ai envoye par int(0123456789), ça ne prend que quatre octets, et non pas 10, ça prend la taille du codage d'un int32, par contre pour l'alphabétique je ne sais plus, à voir ...

Je sais très bien faire ça en vb6, mais en vbNet10 je ne connais pas assez de commandes pour le faire, et je n'arrive pas à les trouver non plus, à chaque fois qu'il y a une méthode parce qu'il me manque quelque chose, la méthode trouvée est différente de la précédente, c'est sans fin.

Donc si tu veux bien avoir l'amabilité de produire quelques lignes de codes suite à mes deux questions je t'en saurais gré, cordialement.

Joe.
.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Re

Je pars du principe que tu as déjà fait des essais, tu nous l'as dit, et que tu as aussi fait des recherches parmi les sources du site.
J'ai, à l'instant, tapé les mots "string byte" dans la recherche des sources en .Net uniquement et il y a des exemples concrets.

Pour l'éditeur, je parlais d'éditeur genre Hackman (ou Notepad++ ?), d'éditeurs hexadécimaux.
Oui, le stockage d'un Integer .Net se code sur 4 octets, comme en mémoire. Mais les caractères resteront des caractères (codes Ascii).

Pourquoi limiter la taille des champs ?
Sans limitation, tu peux appliquer les solutions trouvées parmi <les sources>, ou inventer une méthode "maison", genre de celles utilisées dans les fichiers structurés :
Tu sais que tu as un couple de string par fiche.
1ère donnée : (sur un seul octet *) Longueur en byte du champ texte à suivre
2ème donnée : (sur X octets) Le contenu du champ texte "Nom"
3ème donnée : (sur un seul octet *) Longueur en byte du champ texte à suivre
4ème donnée : (sur X octets) Le contenu du champ texte "Mot de passe"
5ème donnée optionnel : un ou deux bytes de fin, genre 00 ou 00 00
(*) un seul octet --> longueur maxi du champ 255 caractères = suffisant

Il faudra que tu définissent si tes textes seront Unicode ou pas (2 bytes/1 byte par caractère)
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
5
ter... (après c'est "quater", "quintet" ...)

Je dois faire un tableau de bytes sans même savoir ce qu'est un tableau de bytes, je n'ai jamais fait ça en 12 ans de vb6, alors faire un tableau de bytes sans savoir ce que c'est, effectivement c'est très difficile à trouver, car même si je passe dessus je ne saurais pas que c'est ça.

Voici quelques essais, oh, au total en lisant (qu'en français pour moi), quelques tutoriels et aides, j'ai trouvé en une semaine du code comme tu dis, sauf que ça ne marche pas, voici :

Dim Nom As String = "Une"
'
Dim leNom() As Byte = "U", "n", "e"
Dim leNom() As Byte = 'U', 'n', 'e'
Dim leNom() As Byte = 'Une'
Dim leNom() As Byte = "Une"
Dim leNom() As Byte = {"U", "n", "e"}
Dim leNom() As Byte = {'U', 'n', 'e'}
Dim leNom() As Byte = {U, n, e}
Dim leNom() As Byte = {Nom}
Dim leNom() As Byte = Nom
Dim leNom() As Byte = "Nom"
Dim leNom As Byte = "U", "n", "e"
Dim leNom As Byte = 'U', 'n', 'e'
Dim leNom As Byte = 'Une'
Dim leNom As Byte = "Une"
Dim leNom As Byte = {"U", "n", "e"}
Dim leNom As Byte = {U, n, e}
Dim leNom As Byte = {'U', 'n', 'e'}
Dim leNom As Byte = {Nom}
Dim leNom As Byte = Nom
Dim leNom As Byte = "Nom"
Dim lenom() As Byte = New Byte(3) {"U", "n", "e"}
Dim lenom() As Byte = New Byte(3) {'U', 'n', 'e'}
Dim lenom() As Byte = New Byte(3)	'U', 'n', 'e'
Dim lenom() As Byte = New Byte(3) {U, n, e}
Dim leNom As new Byte = {"U", "n", "e"}


Y a rien qui marche dans tout ça !

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

Voici ce que je sais faire, enfentin :
' la variable doit faire la taille de la réception
dim alpha as string * 1
Put pf, n°_octet, alpha ' = 1er octet
Put pf, , Taill_variable_ecriture (écrit depuis début)
Get pf, n°_octet, variable_receptrice


Le seul problème est que vbNet n'accepte pas une variable chaine en écriture fichier binaire :

ecriture.Write(maVariableChaine)


Et pire ! on ne peut plus faire une variable d'un octet, enfin si, mais indirectement, et je ne sais pas faire, je suis débutant !

Dim octet As String * 1


Joe.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Un tableau de Bytes, c'est un tableau qui contient des Bytes. lol

Pour transformer une chaine en tableau de bytes, il suffit que tu fasses une simple recherche, c'est quand même pas compliqué, non ?

Regarde par exemple dans <cette source> trouvée en 24 secondes !
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
5
quartet

Si tu avais dit : "fais un variable indicée du nombre de lettres à y mettre, de type byte, puis à l'aide d'une boucle rentre chaque caractère en le convertissant en code ascii", j'aurais immédiatement compris !

J'ai trouvé, mais le nom prend un octet sans être codé en type byte, c'est-à-dire qu'il est lisible, je peux à la rigueur le mettre dans du integer pour qu'il soit codé, mais n'y aurait-il pas une autre solution, car, pourquoi un integer est codé integer, et pourquoi un byte contenant une valeir ascii n'est pas codée byte ?
Peut être à cause de la valeur ascii, faudait ensuite que je le récupère dans une seconde variable de byte indicé pour l'avoir en numérique pur et qu'il soit codé, ton avis ?

En outre, tu m'as dit que je devais mettre ou pas en unicode (pas unicode = 1 byte par caractère), c'est ce que je veux, comment l'indique-t-on et où dans le code ?

Comment as-tu fait pour changer ton avatar, je ne vois nulle part dans la gestion de mon profile cette possibilité ?

Option Explicit On ' binaire form1 fichier binaire
Public Class Form1
Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim lecture As System.IO.BinaryReader = Nothing
Dim ecriture As System.IO.BinaryWriter = Nothing
Dim leflux As System.IO.FileStream = Nothing
Dim i As Integer = 0
Dim NomFichier As String = My.Application.Info.DirectoryPath & "\binaire.bin"
Dim motDePasse As String = "01234567890" ' maxi 10 entiers
'
Dim leNom As String = "Dupont    "
Dim octet(10) As Byte
For i = 1 To 10
octet(i) = Asc(Mid(leNom, i, 1)) ' ACCEPTE
Next i
'
Try
If Not System.IO.File.Exists(NomFichier) Then	' création
ecriture = New System.IO.BinaryWriter(System.IO.File.Create(NomFichier))
ecriture.Write(CInt(motDePasse))
For i = 1 To 10
ecriture.Write(octet(i))
Next i
ecriture.Close()
End If
leflux = System.IO.File.Open(NomFichier, System.IO.FileMode.Open)	' lecture
lecture = New System.IO.BinaryReader(leflux)
While leflux.Position < leflux.Length
TextBox1.Text = TextBox1.Text & lecture.ReadInt32()
For i = 1 To 10
TextBox1.Text = TextBox1.Text & lecture.ReadChar
Next i
End While
Finally	' fermeture
If Not IsNothing(lecture) Then lecture.Close()
If Not IsNothing(ecriture) Then ecriture.Close()
End Try
End Sub
End Class


Joe.
.