IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Lecture binaire d'un fichier VB6


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Par défaut Lecture binaire d'un fichier VB6
    Bonjour,

    Je migre (réécrit) un petit logiciel VB6 en C#. Je m'attarde actuellement à pouvoir lire les fichiers data existant fait dans une stucture binaire VB6 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    nNumFile = FreeFile
    Open sFileTemp For Binary As #nNumFile
     
        If LOF(nNumFile) > 0 Then
            Get #nNumFile, , lLen
            lSeek = Seek(nNumFile)
            Set macollection = New Collection
            For i = 1 To lLen
                Set oObjet = New cMaClasse
                oObjet.Load nNumFile, lSeek
                macollection.Add ass
            Next
        End If
     
    Close #nNumFile
    et das le .Load :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Public Sub Load(ByVal numFile As Long, ByRef lSeek As Long)
        Get #numFile, , ID 'long
        Get #numFile, , CoefMO 'single
        Get #numFile, , TypeAss 'Integer
     
        'Lecture chaine
        Dim lLen As Long
        Get #numFile, , lLen 'Longueur à lire
        If lLen > 0 Then
            Code = Space$(lLen)
            Get #numFile, , Code
        End If
     
        'Sous classe 
        oFontText.Load numFile
     
        lSeek = Seek(numFile)
    End Sub
    et dans la classe d'oFont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Public Sub Load(ByVal numFile As Long)
        Dim lLen          As Long
        Dim i             As Integer
        Dim lValue As Long
        Dim nLocalVersion As Integer
     
        Get #numFile, , nLocalVersion
        Get #numFile, , iBold
        Get #numFile, , iItalic
        Get #numFile, , iUnderline
        Get #numFile, , iStrikethrough
        Get #numFile, , iSize
        Get #numFile, , iWeight
        Get #numFile, , iCharSet
        Get #numFile, , iColor
     
        Dim i As Long
        Get #hFile, , i
        If i > 0 Then
            sText = Space$(i)
            Get #hFile, ,  iFontName 
        End If
    End Sub
    Voilà pour planter le décor et mon anguoisse.

    En C# c'est assez différent me semble-t-il...

    J'ai commencé comme cela mais déjà je bloque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public void Load(string fileName)
    {
        FileStream stream = new FileStream(fileName, FileMode.Open);
        BinaryReader reader = new BinaryReader(stream);
     
        int value = reader.ReadInt32();
        for (int i = 0; i < value; i++)
        {
            maClasse oObjet = new maClasse();
            ass.ID = reader.ReadInt32();
            ass.CoefMO = reader.ReadSingle();
            ass.TypeAss = reader.ReadInt16();
     
            //là ca me semble mauvais comme code :
            lLen = reader.ReadInt32();
            if (lLen > 0)
            {
                string sSt = new String(' ', lLen);
                 ass.Code = reader.ReadString();
            }
     
            //et là pire :
            Classes.Font oFont = new Classes.Font();
            oFont.Load(reader);
     
            (...)
     
        }
    }
    et la classe oFont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    43
    44
    namespace Classes
    {
        class Font
        {
            private short mVersion=1 ;
     
            string iFontName="arial";
            bool iBold =false;
            bool iItalic ;
            bool iUnderline;
            bool iStrikethrough ;
            double iSize=8.25;
            short iWeight;
            short iCharSet;
            int iColor=0;
     
            public void Load(BinaryReader reader)
            {
                short nLocalVersion= reader.ReadInt16();
                iBold=reader.ReadBoolean();
                iItalic=reader.ReadBoolean();
                iUnderline=reader.ReadBoolean();
                iStrikethrough=reader.ReadBoolean();
                iSize = reader.ReadDouble();
                iWeight= reader.ReadInt16();
                iCharSet= reader.ReadInt16();
                iColor = reader.ReadInt32();
     
                //Get #hFile, , i
                //If i > 0 Then
                //    sText = Space$(i)
                //    Get #hFile, , sText
                //    LoadString = Crypte(sText)
                //End If
                int lLen = reader.ReadInt32();
                if (lLen > 0)
                {
                    string sText = new String(' ', lLen);
                    iFontName = reader.ReadString();
                }
            }
     
        }
    }
    Je suis preneur de toutes remarques ! au secours...

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Par défaut Avancement de mes recherches
    Déjà je viens de constater qu'un boolean VB6 est codé sur 2 octect alors de ReadBoolean n'en lit qu'un seul donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //iBold=reader.ReadBoolean();  DEVIENT :
    iBold=reader.Convert.ToBoolean(reader.ReadInt16());

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Par défaut
    Et si cela peut aider un jour quelqu'un :

    VB6:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Get #numFile, , lLen
    //If lLen > 0 Then
    //    Code = Space$(lLen)
    //    Get #numFile, , sChaine
    //End If
    C#:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int lLen = reader.ReadInt32();
    if (lLen > 0)
    {
        byte[]  b = new byte[lLen];
        reader.Read(b, 0, lLen);
         sChaine = System.Text.Encoding.Default.GetString(b);
    }[/

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Par défaut
    Je reste maintenant bloqué sur un DateTime

    En VB6 il a été enregistré en Put #numFile, , datSaisie
    sur 8 octets

    pour un exemple en lecture binaire ca donnerait un cela : 4675366360657903446 pour cette date : 05/04/2002 11:18:08

    en C# j'imaginai donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Datetime datSaisie=(Datetime)reader.ReadInt64()
    Mais ca plante logiquement !
    Une aide ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Par défaut
    Réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    datSaisie = DateTime.FromOADate(reader.ReadDouble());

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lecture binaire d'un fichier avec header incorporé
    Par gmanouvrier dans le forum Débuter
    Réponses: 4
    Dernier message: 15/11/2013, 18h05
  2. lecture binaire d'un fichier
    Par spirzouf dans le forum Débuter
    Réponses: 5
    Dernier message: 03/11/2011, 01h53
  3. Lecture binaire d'un fichier à un offset précis
    Par israel.jeremy dans le forum Général VBA
    Réponses: 17
    Dernier message: 22/08/2011, 17h14
  4. Lecture binaire d'un fichier image
    Par RyuKa dans le forum Débuter
    Réponses: 8
    Dernier message: 02/06/2011, 16h03
  5. Lecture et parcours de fichiers binaires
    Par john_osaka dans le forum C++
    Réponses: 1
    Dernier message: 07/03/2006, 20h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo