Problème d'écriture en binaire.

Résolu
Gutt_V Messages postés 5 Date d'inscription mercredi 9 septembre 2015 Statut Membre Dernière intervention 17 septembre 2015 - 11 sept. 2015 à 11:55
vb95 Messages postés 3470 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 17 sept. 2015 à 20:51
Bonjour,
Je suis en train d'essayer d'écrire un fichier binaire (au format ov2).
N'étant pas familiarisé avec le binaire, je rame un peu.

Le code que j'ai écrit ne marche.
En ouvrant mon fichier en sortie avec un éditeur hexa, j'aperçois des octets que je ne suis pas censé avoir écrit. Par exemple, mon fichier commence par 1B alors qu'il devrait commencer par 02.

Quelqu'un pourrait-il m'aider a ne plus tourner en rond ?

D'avance merci

 Public codes()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim sFilename, dFilename, StrToSave As String
Dim lenenrg, typenrg As Integer
Dim iLength As Integer = 0
Dim lines() As String

sFilename = "D:\ov2.txt"
dFilename = "D:\first.ov2"
Dim bw As BinaryWriter
bw = New BinaryWriter(File.OpenWrite(dFilename))

lines = System.IO.File.ReadAllLines(sFilename) ' format : X,Y,StrToSavelé


For a% = 0 To UBound(lines)
Dim Xcoor, Ycoor As String
Dim enrg()
enrg = Split(lines(a%), ",") 'récupère les données du fichier texte

'codifie le type et la longueur
typenrg = 2
StrToSave = Chr("&H02")

lenenrg = Len(Trim(enrg(2))) + 13
GetHexa(lenenrg, 8)
StrToSave = StrToSave & Join(codes, "")

'codifie les coordonnées GPS
Xcoor = CDbl(enrg(0)) * 100000
GetHexa(Xcoor, 8)
StrToSave = StrToSave & Join(codes, "")

Ycoor = CDbl(enrg(1)) * 100000
GetHexa(Ycoor, 8)
StrToSave = StrToSave & Join(codes, "")

StrToSave = StrToSave & Trim(enrg(2)) 'rajoute le StrToSavelé

bw.Write(StrToSave) 'ecrit en binaire
Next
End Sub
Function GetHexa(val As String, taille As Integer)
Dim valhexa As String
Dim compt As Integer

valHexa = Hex(val)
Do Until Len(valHexa) = taille
valHexa = "0" & valHexa
Loop

ReDim codes((taille / 2) - 1)
compt = 1
For a% = 0 To UBound(codes)
codes(a%) = Chr(("&H" & Mid(valhexa, compt, 2)))
compt += 2
Next

Array.Reverse(codes)

End Function

7 réponses

vb95 Messages postés 3470 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
11 sept. 2015 à 12:56
bonjour
Évites ce mélange VB 6 - VB Net : enlèves Microsoft Visual Basic dans les propriétés du projet
Mets Option Strict et Option Explicit sur On dans les propriété du projet : ceci t'oblige à déclarer toutes les variables
1B est le code Ascii du & ! StrToSave = Chr("&H02") écrit les 4 valeurs Ascii des caractères &H02 soit 1B 48 30 32 ! il y a une différence entre écrire la valeur 2 et le chiffre 2
Whismeril t'a donné un lien pour apprendre VB net ! buches le et ne brûle pas les étapes !

0
Whismeril Messages postés 19015 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 13 avril 2024 654
11 sept. 2015 à 13:38
Bonjour en complément de la réponse de vb95, que je salue au passage, voici un article qui traite du mélange vb6-vb.net
http://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net

D'autre part, merci de poster tes questions dans le forum vb.net.
0
vb95 Messages postés 3470 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
14 sept. 2015 à 23:04
Bonjour Gutt_V
Voici un code qui te permet de créer un fichier .ov2 ( uniquement avec les POI de type 2 : coordonnées X et Y du point et description )
Le fichier texte d'origine doit contenir un certain nombre de lignes avec les contraintes suivantes
les coordonnées X et Y du point doivent être écrits dans le fichier avec le point comme séparateur décimal et chaque élément doit être séparé par une virgule comme dans les 2 exemples ci-dessous . Les éléments x, Y et description sont écrits sur la même ligne évidemment .

6.35687,43.39831,radar num: 2025 A8
6.41867,43.41412,radar num: 2026 N7

pour la première ligne nous avons
6.35687 : longitude du POI
43.39831 : latitude du POI
radar num: 2025 A8 : description du POI ( numéro de radar)

tu mets tout le code qui suit dans une form et tu lances le projet

Imports System.IO
Imports System.Runtime.InteropServices

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

Dim sFilename, dFilename As String
Dim tailledata As Integer
Dim lines() As String
Dim enregoctet() As Byte

sFilename = "D:\ov2.txt" ' le fichier texte exemple des POI
dFilename = "D:\first.ov2" ' le fichier binaire créé
Dim bw As BinaryWriter
bw = New BinaryWriter(File.OpenWrite(dFilename))

Try
lines = System.IO.File.ReadAllLines(sFilename) ' format : X,Y,DEscription
For i = 0 To lines.Length - 1
Dim Xcoor, Ycoor As Integer
Dim enreg() As String
enreg = Split(lines(i), ",") 'récupère les données du fichier texte

'codifie le type et la longueur
tailledata = enreg(2).TrimEnd.Length + 14 ' taille des données
ReDim enregoctet(0 To tailledata - 1)
enregoctet(0) = 2 ' octet de type = 2 en position 0 de l'enregistrement POI
Marshal.WriteInt32(enregoctet, 1, tailledata) ' écrit les 4 octets de la taille
enregoctet(tailledata - 1) = 0 ' octet 0 de fin d'enregistrement du POI

'codifie les coordonnées GPS
enreg(0) = enreg(0).Replace(".", ",") ' séparateur décimal est la virgule en France
Xcoor = CInt(CDbl(enreg(0)) * 100000)
Marshal.WriteInt32(enregoctet, 5, Xcoor) ' écrit les 4 octets de la latitude
enreg(1) = enreg(1).Replace(".", ",")
Ycoor = CInt(CDbl(enreg(1)) * 100000)
Marshal.WriteInt32(enregoctet, 9, Ycoor) ' écrit les 4 octets de la longitude
Dim maArray As Char() = enreg(2).ToCharArray
For j = 0 To enreg(2).Length - 1
Marshal.WriteByte(enregoctet, 13 + j, Convert.ToByte(maArray(j)))
Next
bw.Write(enregoctet) 'ecrit en binaire
Next
MessageBox.Show("Le fichier a été créé")
Catch
MessageBox.Show(" Erreur")
End Try
bw.Close()

End Sub

End Class

0
vb95 Messages postés 3470 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
15 sept. 2015 à 00:59
Pour Gutt_V
Remplace le code précédent par celui-ci
Le code précédent comporte une erreur et ne dispose pas des boites de dialogue de sélection de fichiers


Imports System.IO
Imports System.Runtime.InteropServices

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown

Dim sFilename, dFilename As String
Dim tailledata As Integer
Dim lines() As String
Dim enregoctet() As Byte

OpenFileDialog1.Filter = "Fichier texte des POI (*.txt)|*.txt" '"Fichier TomTom Binary (*.ov2)|*.ov2"
'si ok sur boite de dialogue
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
sFilename = OpenFileDialog1.FileName ' le fichier texte exemple des POI
SaveFileDialog1.Filter = "Fichier TomTom Binary (*.ov2)|*.ov2"
'si ok sur boite de dialogue
If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
dFilename = SaveFileDialog1.FileName ' le fichier binaire .ov2 créé
Dim bw As BinaryWriter = New BinaryWriter(File.OpenWrite(dFilename))
Try
lines = System.IO.File.ReadAllLines(sFilename) ' format : X,Y,DEscription
For i = 0 To lines.Length - 1
Dim Xcoor, Ycoor As Integer

Dim enreg() As String
enreg = Split(lines(i), ",") 'récupère les données du fichier texte

'codifie le type et la longueur
tailledata = enreg(2).TrimEnd.Length + 14 ' taille des données
ReDim enregoctet(0 To tailledata - 1)
enregoctet(0) = 2 ' octet de type = 2 en position 0 de l'enregistrement POI
Marshal.WriteInt32(enregoctet, 1, tailledata) ' écrit les 4 octets de la taille
enregoctet(tailledata - 1) = 0 ' octet 0 de fin d'enregistrement du POI

'codifie les coordonnées GPS
enreg(0) = enreg(0).Replace(".", ",") ' séparateur décimal est la virgule en France
Xcoor = CInt(CDbl(enreg(0)) * 100000)
Marshal.WriteInt32(enregoctet, 5, Xcoor) ' écrit les 4 octets de la longitude
enreg(1) = enreg(1).Replace(".", ",")
Ycoor = CInt(CDbl(enreg(1)) * 100000)
Marshal.WriteInt32(enregoctet, 9, Ycoor) ' écrit les 4 octets de la latitude
Dim maArray As Char() = enreg(2).ToCharArray
For j = 0 To enreg(2).Length - 1
Marshal.WriteByte(enregoctet, 13 + j, Convert.ToByte(maArray(j)))
Next
bw.Write(enregoctet, 0, enregoctet.Length) 'ecrit en binaire
Next
MessageBox.Show("Le fichier a été créé")
Catch
MessageBox.Show(" Erreur ")
End Try
bw.Close()
End If
End If

End Sub

End Class
0

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

Posez votre question
vb95 Messages postés 3470 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
16 sept. 2015 à 16:18
salut Gutt_V
Ton problème est résolu : super
un petit merci aurait été bien agréable à lire !!!!
0
Gutt_V Messages postés 5 Date d'inscription mercredi 9 septembre 2015 Statut Membre Dernière intervention 17 septembre 2015
17 sept. 2015 à 17:35
Bonjour,
Pas un petit merci, un ENORME merci !!!
Désolé pour le long silence : plus de connexion internet à cause des orages...
J'en ai profité pour revoir mon code, mais je n'étais pas arrivé a un stade aussi avancé !
C'est promis, je vais laissé tomber le VB6, mais je ne suis pas un programmeur pro, il me faudra un peu de temps pour changer mes vieilles habitudes !
Et encore merci pour le code qui me convient parfaitement !
0
vb95 Messages postés 3470 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
17 sept. 2015 à 20:51
Pas de soucis Gutt_V !
C'est vrai que la météo est assez méchante avec pas mal de monde en ce moment !
Moi aussi je ne suis qu'un amateur comme toi !
Moi cela ne fait que 4 ans environ que je suis passé à VB Net et j'ai encore parfois des réflexes VB6 ! J'ai commencé en VB 4 dans les années 1995 !
si cela te convient tant mieux ! Ce fut un plaisir
bonne prog à toi
0
Rejoignez-nous