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 :

Comment enregistrer un tableau de bits TBits


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Comment enregistrer un tableau de bits TBits
    Bonjour,

    Sous Delphi existe-t'il un moyen d'enregistrer un tableau de bits Tbits sans coder les bits sur un caractère ?

    Exemple : un tableau de 100 bits, enregistré dans un fichier texte, occupe 100 octets si j'utilise la fonction BoolToStr(). Ne peut-on pas l'enregistrer sur 100 bits ? Pour des TBits de grandes dimensions le fichier devient vraiment trop grand !

    Si oui, quelqu'un peut-il me donner un exemple source d'une écriture et d'une lecture d'un fichier contenant un Tbits ?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Tu peux, je pense, prendre tes bits par paquets de 8, et inscrire dans ton fichier le caractère ascii correspondant au 8 bits ainsi pris... non ?

    Le codage doit pas être difficile.

    Mais Dr Who se fera un plaisir de te proposer un code aux petits oignons.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    En Trichant sauvage, avec un Hack de Propriété Private ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    THackBits = class
      FSize: Integer;
      FBits: PChar;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var
      ObjBits: TBits;
    ...
      Stream.Write(THackBits(ObjBits).FBits^, FSize div 8);
    Je comprends pas pourquoi cette classe n'a pas de fonction de Stream pour la sérialization, ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
      Stream.Write(THackBits(ObjBits).FBits^, );
    Je comprends pas pourquoi cette classe n'a pas de fonction de Stream pour la sérialization, ...
    il aura un problème de granularité

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    C'est quoi la différence entreet ?

    Pour la Granularité, on s'en fout, TBits allouent 4 octets par 4 octets, et les Bits Surnémaires sont à False ! Donc, Si l'on Ecrit dans un Fichier le Size puis le Data, on conserve la mémoire dans le bon état, et l'on gère la Granularité !
    0 Bit = 0 Octet = 0 Bit
    1 Bits = 4 Octets = 32 Bits
    32 Bits = 4 Octets = 32 Bits
    33 Bits = 8 Octets = 64 Bits
    64 Bits = 8 Octets = 64 Bits
    65 Bits = 12 Octets = 96 Bits
    ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Stream.Write(THackBits(ObjBits).Size, SizeOf(Integer));
    Stream.Write(THackBits(ObjBits).FBits^, ObjBits.Size div 8);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Stream.Read(TmpSize, SizeOf(Integer));
    ObjBits.Size := TmpSize; // Allocation
    Stream.Read(THackBits(ObjBits).FBits^, ObjBits.Size div 8);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    en effet, j'ai un petit truc de dérrière les fagots.

    voir pj, unité BitsStock, classe TBitsStock
    Fichiers attachés Fichiers attachés
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  7. #7
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    je disais cela uniquement si size vaut le nombre de bits TBits.Count

    pour la Granularité Getmem n'alloue pas moin de 8+4 octets pour la première allocation et après elle utilise alignement sur 4

Discussions similaires

  1. [D2007, ADO, MSACCESS]Comment enregistrer un tableau grande taille ?
    Par colorid dans le forum Bases de données
    Réponses: 9
    Dernier message: 04/07/2007, 18h39
  2. [TP] Comment lire un tableau d'enregistrements ?
    Par ruud101 dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 11/05/2007, 23h59
  3. Comment enregistrer un tableau en session
    Par Snyfer dans le forum Langage
    Réponses: 4
    Dernier message: 27/03/2007, 11h48

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