1 pièce(s) jointe(s)
Lecture fichier typé Delphi avec VB.Net
Bonjour a tous,
Je cherche a lire dans une appli VB.Net des fichiers typés créés a partir d'une appli developpée en Delphi.
Ces fichiers sont composés de n records décrit comme ci dessus (extrait de code Delphi) :
Code:
1 2 3 4 5 6 7 8 9 10
| TTargetData40 = record
CycleMax: word; // Nombre de cycles out of range
Kind: byte;
Name: string[40];
DateTime: double;
HAngle: double; // angle Hz si kind = 0, direction si kind = 1
VAngle: double; // angle V si kind = 0, inclination si kind = 1
D: double; // Distance
Status: integer; // Statut
end; |
Pour lire ces fichiers sous VB.Net, je me suis créé une Class équivalente au type Delphi décrit ci-dessus. J'ai ensuite écrit une procédure avec la fonction FileGetObject pour tenter de récuperer le contenu de ces fichiers :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Public Class BinData40
Public CycleMax As Integer
Public Kind As Integer
<VBFixedString(40)> Public Name As String
Public Datetime As Double
Public Hangle As Double
Public Vangle As Double
Public D As Double
Public Status As Integer
End Class
Public Sub ReadBinFile()
Dim BinRec() As BinData40
Dim nfic
Dim strfilename As String = "C:\Monchemin ...\filetypeDelphi.bin"
nfic = FreeFile()
FileOpen(nfic, strFilename, OpenMode.Binary)
FileGetObject(nfic, BinRec)
FileClose(nfic)
End Sub |
J'ai tenté plusieurs autres méthodes avec des BinaryReader, mais rien a faire, il m'est impossible de récuperer les records !
J'en appelle a votre aide.
Merci d'avance de vos réponses.
(Je précise que je n'ai aucunes connaissances en Delphi, et que je ne suis pas un developpeur pro en VB.Net _ niveau moyen)
[Edit:] Voici a quoi ressemble le contenu des fichiers BIN déchiffrés avec une appli Delphi.
Citation:
0 1 SERIALNUMBER 14/10/2013 00:10:55 0 0 100582 0
...
0 0 C02RP50105s 14/10/2013 00:10:55 181.59953 102.79402 18.51655 0
0 0 C02RP50106s 14/10/2013 00:10:55 208.45692 106.26708 16.817 0
0 0 C02RP50107s 14/10/2013 00:10:55 0 0 0 1
0 0 C02RP50108s 14/10/2013 00:10:55 220.98863 111.37649 6.66775 0
0 0 C02RP50109s 14/10/2013 00:10:55 220.81178 89.56875 6.5956 0
Remplacement de chaine de caractere a l'interieur du fichier bin
Bonjour Thomas,
Merci beaucoup pour ton aide concernant la lecture des fichiers bin en vb.net. Cela nous a ete tres utile (je travaille en effet en collaboration Matthieu).
J'ai une autre question concernant ce probleme. Ce que je cherche a faire maintenant, c'est remplacer une chaine de caracteres presente dans le meme type de fichier bin par une autre chaine de caracteres.
Exemple:
Pour le type de fichier suivant: remplacer la chaine '14/10/2013 00:10:55' par '13/10/2013 20:10:55'
Fichier .bin en entree:
0 1 SERIALNUMBER 14/10/2013 00:10:55 0 0 100582 0
...
0 0 C02RP50105s 14/10/2013 00:10:55 181.59953 102.79402 18.51655 0
0 0 C02RP50106s 14/10/2013 00:10:55 208.45692 106.26708 16.817 0
0 0 C02RP50107s 14/10/2013 00:10:55 0 0 0 1
...
Fichier .bin desire en sortie:
0 1 SERIALNUMBER 13/10/2013 20:10:55 0 0 100582 0
...
0 0 C02RP50105s 13/10/2013 20:10:55 181.59953 102.79402 18.51655 0
0 0 C02RP50106s 13/10/2013 20:10:55 208.45692 106.26708 16.817 0
0 0 C02RP50107s 13/10/2013 20:10:55 0 0 0 1
...
Y a-t-il une moyen de remplacer facilement la chaine de caracteres dans le meme style que la fonction remplacer du bloc note? Ou faut-il decoder (lire) le fichier puis le recoder (reecrire) après?
J'essaie pour l'instant de faire de la lecture/ecriture mais il est vrai que je butte un peu sur la partie ecriture probablement a cause du padding.
Du coup, la date est impactee puis tout ce qui suit, mais difficile de savoir si ca vient du probleme de date en lui meme ou a cause de l'espace.
Voila, ce que j'ai pour l'instant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
Private Shared Sub WriteRecords(ByVal RecordBin As IEnumerable(Of RecordBIN)) 'As IEnumerable(Of RecordBIN)
'Using stream = File.OpenRead(Path), reader = New BinaryReader(stream)
Dim path As String
Dim Stream As New FileStream(path, FileMode.CreateNew)
Dim writer = New BinaryWriter(Stream)
Dim mySpace As String = " "
Dim SpaceBytes As Byte()
SpaceBytes = System.Text.Encoding.Unicode.GetBytes(mySpace)
Debug.Print(SpaceBytes.Length)
Dim myNewDate As New System.DateTime(1996, 6, 3, 22, 15, 0)
Dim newDate As String = myNewDate.ToOADate()
'While True
Try
For Each line As RecordBIN In RecordBin
writer.Write(line.CycleMax)
writer.Write(line.Kind)
'Dim lengthName As Byte() = System.Text.Encoding.Unicode.GetBytes(line.Name.Length.ToString)
'writer.Write(lengthName)
writer.Write(line.Name)
writer.Write(SpaceBytes)
'writer.Write(newDate)
writer.Write(line.DateTime)
writer.Write(line.Hangle)
writer.Write(line.Vangle)
writer.Write(line.D)
writer.Write(line.Status)
writer.Write(SpaceBytes)
Next
Catch ex As EndOfStreamException
'Return
End Try
'Yield RecordBin
'End While
End Sub |
Merci