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 :

WordRec Convertir Word en Tableau de Byte


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 115
    Par défaut WordRec Convertir Word en Tableau de Byte
    Bonjour,

    Je voulais transformer un "Word" en "Array of Byte".
    Et je suis tomber la dessus.
    (Issue de l'aide de Delphi)

    -------------
    Pascal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WordRec = packed record
      case Integer of
        0: (Hi: Byte;
            Lo: Byte;);
        1: (Bytes: array [0..1] of Byte););
    end;
    Fichier
    SysUtils
    --------

    Utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Data[0]:= WordRec(Value).Lo;
    Data[1]:= WordRec(Value).Hi;
    Diantre, je ne comprend absolument pas cette écriture???
    Un case de Integer ?
    Si quelqu'un a une idée?
    Merci

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    Par défaut
    C'est l'équivalent Delphi des union struct du C++
    Partie variable des enregistrements


    Pour résumer Hi et Lo partage le même espace mémoire que Bytes[0] et Bytes[1]
    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

  3. #3
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    Oui, en fait dans un record, quand on déclare un case of (qui pourrait être integer, word ou byte, cela n'as pas d'importance pour le moment) c'est comme si nous créions des "tiroirs" virtuels sur chaque octets de l'espace mémoire utilisé par le case of, qui, pourrait être vulgairement décrit comme un élément "non nommé" de record.

    pour cela il faut bien comprend les Registres en assembleur, ça aide, puisque c'est le même concept de lecture/ecriture (quand on travail sur EAX, AX, AH et HL)

    on pourrait même écrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TUnPaquet = packed record
      case integer of
        0: (LW: LongWord);
        1: (W1,W2: word);
        2: (B1,B2,B3,B4: byte);
        3: (aW: array[0..1] of word);
        4: (aB: array[0..3] of byte);
        5: (aC: array[0..3] of AnsiChar);
    end;
    LW est un entier non signé 32bit (4 octets)
    W1, W2 et aW sont des entiers non signé 16bits (2 octets) qui partagerons respectivement le même bloc mémoire que LW (4 octets)
    B1 à B4 et aB sont des entiers non signé 8bits (1 octets) qui auront la même particularité que W1, W2 et aW.
    aC sont des caractères ansi, équivalent à des entiers non signé 8bits.

    découpage du bloc mémoire pour TUnPaquet:
    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
     
    TUnPaquet    [00|00|00|00] = 32bits = 4 octets (bytes)
    octets       [ 1| 2| 3| 4]
     
    LW           [00|00|00|00]   // bloc complet 
    W1 ou aW[1]  [00|00]         // partie haute du bloc
    W2 ou aW[0]        [00|00]   // partie basse du bloc
    B1 ou aB[3]  [00]
    B2 ou aB[2]     [00]
    B3 ou aB[1]        [00]
    B4 ou aB[0]           [00]
    aC[3]        [00]
    aC[2]           [00]
    aC[1]              [00]
    aC[0]                 [00]
     
     
    en comparaison avec un registre 32bits :
     
    EAX [00|00|00|00]  
    AX        [00|00]   
    AH        [00]
    AL           [00]
    [ 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!

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Par défaut
    Discussion déja entamée dans le forum pour la partie Record Packed. ici
    Je rajouterai juste que le mot clé Packed devant le record veut dire minimiser l'espace mémoire pris par l'objet.

    Normalement, les types de données complexes, comme les record ont leurs éléments alignés a 2, 4 ou 8 octets, selon le type de données. Par exemple un Word va être aligné sur 4 octets. L'alignements permet des performances d'accès optimale.

    Le mot clé Packed, comprime les données a la plus petite taille avec comme conséquence une réduction des performances d'accès.

  5. #5
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Oui, le "case integer of" dans un record (partie variante d'un enregistrement) est peu connu...

    Sans vouloir rien affirmer de façon péremptoire, il me semble bien que ça fait partie de la sémantique du langage Pascal depuis ses origines.

    J'ai cherché la référence chez N. Wirth itself, mais je ne tombe que sur des articles payants. Si quelqu'un peut confirmer que c'était déjà dans la version 1971...

    C'était prévu au départ pour stocker des enregistrements pouvant avoir différentes formes dans un même fichier, en faisant utiliser le même "espace mémoire" (vu de façon abstraite) par les différentes formes que pouvait prendre l'enregistrement. Dans les années '60/'70, les octets coûtaient chers, et donc étaient précieux.

    Maintenant, s'en servir pour accéder aux octets d'une variable est une astuce souvent utilisée, mais ce n'était pas fait pour ça au départ. Et ça rend le programme dépendant de l'implémentation.

    Pour le "packed", j'ai rien à ajouter à ce qui a déjà été rappelé.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    parmi les petites astuces pour interpréter différemment un type de variable, on peut utiliser la directive absolute qui fait pointer une seconde variable de type différent sur le même espace mémoire qu'une première :
    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
    type 
      TWordRec = packed record
        Hi: Byte;
        Lo: Byte;
      end;
     
      TBytes: array [0..1] of Byte);
     
    var
      Mot : Word;  
      WordRec: TWordRec; absolute Mot;
      Bytes: TBytes; absolute Mot;
     
    begin
      Mot:=$FFFF; // comme ça, pas de problème ;-)
      if WordRec.Hi=Bytes[0] then ShowMessage'Bingo');
    end;
    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 !

Discussions similaires

  1. Convertir BitmapImage en tableau de byte en wpf
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 11/02/2014, 16h52
  2. convertir object en tableau de byte et inversement
    Par wolfazer dans le forum VB.NET
    Réponses: 5
    Dernier message: 27/11/2008, 10h39
  3. convertir string en tableau de byte
    Par wolfazer dans le forum VB.NET
    Réponses: 3
    Dernier message: 29/10/2007, 08h15
  4. [C#] Convertir un tableau de byte en Image
    Par goulhasch dans le forum ASP.NET
    Réponses: 4
    Dernier message: 24/01/2005, 10h12

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