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

Langage Delphi Discussion :

format binaire d'un record sérialisé


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut format binaire d'un record sérialisé
    Bonjour,

    Je dispose d'une application delphi dans laquelle est sérialisée le record suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TNoeud = record
               Ident : string[10];
               CoordX : longint;
               CoordY : longint;
    end;
    La lecture dans l'application delphi s'effectue comme il suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BlockRead(FBIN, noeud, sizeof( TNoeud ) );
    Mon problème est que je désire lire ces objets sérialisés dans une application ... C++ !

    Du coup, ma question est la suivante: quel est le format binaire exact de cette sauvegarde. Mes deux supposition sont les suivantes:

    1:
    1 octet pour chaque caractère de la chaîne * 10 + 4 octets pour CoordX puis 4 octets pour CoordY.

    2:
    1 octet pour chaque caractère de la chaîne * 10 + 2 octets "dummy" pour obtenir 4*3 octets alignables sur 3 mots mémoires de 32 bits + 4 octets pour coordX puis 4 octets pour CoordY.

    S'il y a des bits dummy pour aligner la chaîne de caractère sur des mots mémoires, ceux-ci sont-ils avant la chaine ou après dans le fichier binaire?

    Cordialement,

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Alors

    1) un STRING[x] est automatiquement un ShortString, donc il y a un index 0 qui contient la longueur utile de la chaine (le nombre de caractères réellement utilisés)

    2) ça dépend des options de compilation

    donc tu as au minimum ceci
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct {
      Char IdentLen
      Char Ident[10];
      int CoordX;
      int CoordY;
    }

    ça serait le cas sur un "packed record", maintenant tu peux avoir du padding pour aligner la structure.

    Pour le savoir, le plus simple est d'ajouter ceci dans le code Delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      node : TNoeud;
    begin
      ShowMessage('SizeOf(TNoeud) = ' + IntToStr(SizeOf(node)));
      ShowMessage('@TNoeud.CoordX = ' + IntToStr(Cardinal(@node.CoordX) - Cardinal(@node)));
    end;
    avec ça tu as la taille de la structure et la position du champ CoordX à l'intérieur
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    Merci pour ces précisions, grâce à votre suggession, je viens de vérifier, coordX est en position 12 et coordY naturellement en position 16. Ma seconde intuition était donc bonne.

    Après, dans les douze premiers octets de la sauvegarde sérialisée, il me faut savoir quels octets représentent vraiment la chaîne.

    prenons l'exemple de la chaîne "a1000" serait-ce plutôt:

    1er octet pour la longueur utile, donc 5 puis 5 octets pour la chaîne, puis 6 octets "dummy" ?

    Pour une petite chaîne de caractère, bien que dans le code on précise la taille (10), n'y a t'il pas le risque que la sérialisation "tronque" cette chaîne en 8 octets (2 mots mémoire)? De même la chaîne "a1" tiendrait sur un mot mémoire...

    Cordialement,

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Benoit_T Voir le message
    Merci pour ces précisions, grâce à votre suggession, je viens de vérifier, coordX est en position 12 et coordY naturellement en position 16. Ma seconde intuition était donc bonne.

    Après, dans les douze premiers octets de la sauvegarde sérialisée, il me faut savoir quels octets représentent vraiment la chaîne.

    prenons l'exemple de la chaîne "a1000" serait-ce plutôt:

    1er octet pour la longueur utile, donc 5 puis 5 octets pour la chaîne, puis 6 octets "dummy" ?

    Pour une petite chaîne de caractère, bien que dans le code on précise la taille (10), n'y a t'il pas le risque que la sérialisation "tronque" cette chaîne en 8 octets (2 mots mémoire)? De même la chaîne "a1" tiendrait sur un mot mémoire...

    Cordialement,
    les octets "non utils" ont une valeur non déterminée... par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    begin
      node.Ident := '1234567890'; // tout est défini avec un #10 devant
      node.ident := 'abc'; // on obtient #3'abc4567890'
    end;
    les ShortString sont des tableaux statiques, donc l'allocation est de taille fixe.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Format binaire et Norme IEEE
    Par luffy64 dans le forum Langage
    Réponses: 5
    Dernier message: 02/02/2010, 10h17
  2. Format binaire d'Excel 2007
    Par Jibse dans le forum Excel
    Réponses: 2
    Dernier message: 30/01/2009, 09h12
  3. [Tableaux] trouver la taille d'une image au format binaire
    Par epeichette dans le forum Langage
    Réponses: 5
    Dernier message: 21/11/2008, 13h12
  4. Déclaration constante au format binaire sous D7
    Par DavidDB dans le forum Débuter
    Réponses: 2
    Dernier message: 07/07/2008, 22h20
  5. afficher un nombre sous format binaire?
    Par sofiane44 dans le forum C++
    Réponses: 2
    Dernier message: 20/01/2006, 18h47

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