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

 Delphi Discussion :

Encodage efficace d'un array de boolean - idée inside.


Sujet :

Delphi

  1. #1
    Membre régulier Avatar de user 56gt8
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 92
    Points
    92
    Par défaut Encodage efficace d'un array de boolean - idée inside.
    Bonjour , je recherche de l'aide par rapport à une petite idée que j'aimerais utiliser dans un projet perso qui n'avance pas.

    Dans ce projet , un peu typé : tableau , base de donnée , explorateur de fichier , j'utilse des tags , des qualificatifs pour décrire un fichier particulier.

    J'ai donc par exemple un array[0..249] of boolean pour chaque entrée de la bdd
    Au niveau de la sauvegarde de la pseudo bdd je me suis confronté au problème de la taille et du temps pris pour écrire ce fichier.les txt , les ini , les xmls etc ca ne collait pas et là aujourd'hui : "tilt":

    l'array de bool ce n'est autre que des séries de 0100010010011110111
    Bref du binaire....
    Alors au lieu de stocker cette string je stocke sa représentation décimale
    via un sympathique bintoint trouvé ici :
    http://delphi.about.com/od/mathemati...aseconvert.htm

    Bref génial l'écriture de la sauvegarde est 250X plus rapide et le fichier est 40X moins gros...


    Le problème c'est que l'interprétation inverse ne marche pas:

    voici la démarche:
    *Lire la ligne en question (elle contient un longint qui représente l'array de boolean de manière encodée et compréssée , si vous avez suivit) readln
    *la transormer en chaine binaire : strtoint() puis inttobin()
    *lire char par char la chaine et convertir en bool selon les '0' ou '1'

    Au niveau de la logique c'est superbe, mais ca ne marche pas.
    La chaine binaire est à l'envers , c.a.d que dans mon logiciel il y a souvent
    100110010010011 suivit de 235 '0' comme tous les tags ne sont pas définis.

    Et lors de la transformation inverse je retrouve 235 '0' puis mon '100110010010011' d'origine.
    Et pas moyen de faire ca correctement avec les strutils.

    Quelq'un saurait il m'aider au niveau cette transformation et inverse de chaine binaire?
    Quelqu'un connait il un composant qui permette de travailler au niveau des octets et en binaire ?

    Sinon à la base c'est génial comme idée non ?Ca a déjà été fait et utilisé ?

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    hello,

    j'utiliserais bien, dans ce cas, un descendant de TBits, qui implémenterait un LoadFromStream/SaveToStream

    sinon, pour ton pb, montre nous le code
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    SAlut
    C'est plutot etonant etant donner que les 0 placer devant ne sont pas des bits significatif, alors qu'a la transcription bit -> int il etaient apres et donc cette fois ci significatif, la valeur decimal qui en decoule est effectivement totalement differente.
    Je serai egalement curieux de voir un bout de code, le sujet semble interessant.

    [Edit]
    Je pense avoir une raison possible a ton probleme
    Pour moi la fonction BinToInt renvoie une valeur erronnée puisqu'elle ne tient pas compte des 0 se trouvant a droite du dernier bit a 1
    Pour cette function 1000 = 1
    [/Edit]

    [Edit2]
    Tiens trouvé egalement sur Torry's
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function TForm1.BinToInt(Value: string): Integer;
    var
      i, iValueSize: Integer;
    begin
      Result := 0;
      iValueSize := Length(Value);
      for i := iValueSize downto 1 do
        if Value[i] = '1' then Result := Result + (1 shl (iValueSize - i));
    end;
    Avec ca ca fonctionne au poile.
    [/Edit2]
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. [Encodage] PHP SOAP ARRAY PB ENCODAGE
    Par T4GAD4 dans le forum Langage
    Réponses: 4
    Dernier message: 07/12/2014, 18h57
  2. [array] array_key_exists() ou une autre idée
    Par camyo dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2014, 12h12
  3. must be an array, boolean given,
    Par hagounet dans le forum Langage
    Réponses: 5
    Dernier message: 21/02/2013, 19h41
  4. Réponses: 3
    Dernier message: 04/08/2012, 13h11
  5. Control Array (netbeans IDE)
    Par javan00b dans le forum NetBeans
    Réponses: 1
    Dernier message: 30/08/2009, 12h39

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