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 :

Opérations sur les bits


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut Opérations sur les bits
    Bonjour à tous,

    Je dois écrire une routine pour piloter un périphérique qui utilise un protocole spécifique. A chaque envoi de donnée vers ce périphérique, je dois faire des opérations tel que Rotate right et OR et XOR.

    Puis je faire cela avec Delphi et dans l'affirmative, si quelqu'un peut m'aider à aborder ce problème ?


    Pour information, voici le protocole que je dois utiliser :
    Merci d'avance pour vos réponses,
    Wilco


    A BLOCK has the following structure:

    STX BN data ETX LRC DRC

    Where

    BN Block Number (Modulo-2). This number is bumped by 1 for each
    Transmitted Block except in the case of re-transmission.

    data Up to 512 bytes of LOGICAL LAYER DATA. If each byte of data
    required a DLE sequence then 1024 bytes would be present

    LRC LONGITUDINAL REDUNDANCY CHECK. The EVEN PARITY of all
    LOGICAL LAYER DATA characters bit columns (excluding the STX
    and all DLE characters) but including the ETX character. Note that the
    LRC may take on a value of one of the used CONTROL
    CHARACTERS but NO DLE is needed since the LRC ALWAYS follows
    the ETX character.

    DRC DIAGONAL REDUNDANCY CHECK. The even parity of all
    LOGICAL LAYER DATA characters bit diagonals (excluding the STX
    all DLE characters) but including the ETX character. This is formed
    using the following algorithm:
    DRC = (Rotate Right DRC) XOR (Character).

    Note that the DRC may take on a value of the control characters but no
    DLE is needed, since the DRC always follows the ETX and LRC character.



    2.3. Steps in calculating DRC

    1. Set the first character after STX as the initial value of the DRC variable.

    2. Rotate DRC right one Bit position. Example.- Byte hex 3D becomes hex 9E after
    rotation (0011 1101 -> 1001 1110).

    3. Get next character from the message block. Exclusive OR this character with
    the Rotated DRC and place the result into DRC.

    4. If this character was an ETX, then DRC calculation done.

    5. Otherwise, go to step 2.

    For example, the block, <STX>0<SOM>SM;A;BA<EOM><ETX> will produce
    DRC as hex 34.

  2. #2
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    pour les opérateurs logiques bit à bit. déjà, il faut connaître les tables de vérité.

    or: 0,0->0 0 ,1->1 1,0->1 1,1->1
    Xor :0,0->0 0 ,1->1 1,0->1 1,1->0
    and: 0,0->0 0,1->0 1,0->0 1,1->1

    exemple: 12 or 5 :
    12->1100
    5->0101
    -------
    1101--->résultat :13
    tu compares les bits de même poids avec l'opérateur or

    etc.

    c'est un début.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Oui c'est sûrement possible, voir l'aide de Delphi, en particulier les shl/shr et compagnie...

  4. #4
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    Effectivement, tu vas pouvoir faire des rotations de bits... (shl/shr)

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    Merci à vous 2 pour vos réponses,


    J'ai bien trouvé dans l'aide de delphi les opérateurs bit à bit comme shl/shr et xor. Cependant je cherche à faire une opération de rotation sur les bits et non une opération de décalage

    shl et shr font une opération de décalage et déplacent chacun des bits d'un nombre binaire sur la gauche (ou la droite), mais ceux-ci sortent, c'est-à-dire qu'ils sont définitivement perdus, lorsqu'ils arrivent au bit de poids fort (ou de poids faible).

    Exemple : 10111101 shl 1 devient 01111010

    Dans une rotation, 10111101 left_rotate 1 devient 01111011 Le bit le plus à gauche prend la place du 1er bit à droite.

    Je n'ai pas trouvé dans Delphi de fonction rotate droite ou gauche. Quelqu'un a t il une idée pour effectuer une opération de rotation sur les bits ?


    Merci d'avance
    Wilco

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    Bonsoir et merci à tous,

    Encore une fois ce forum m'aide à résoudre un problème.

    Poiur ceux que cela aiderait, Delphi offre les fonctions shl et shr qui ne font que des décalages de bits à droite ou à gauche.

    Pour faire des rotations binaires (byte sur 8 bits) vos pouvez utiliser la fonction suivante :

    // Rotation à droite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function ROR(Value: Byte ; N : integer) : Byte ;
    begin  
    Result := (Value shr N) + (Value shl (8-N))  
    end ;
     
     
    // Rotation à gauche
    function ROL(Value: Byte ; N : integer) : Byte ;
    begin  
    Result := (Value shl N) + (Value shr (8-N))  
    end ;
    Merci à Goustifruit et à Archimède pour m'avoir mis sur une piste.

    Wilco

  7. #7
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Ca n'existe pas dans Delphi.

    Mais ça peut se faire facilement en utilisant l'assembleur inline

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function ROR(Valeur:Byte):Byte;Register;Overload;
    Asm
      ROR AL,1
    End;
     
    Function ROR(Valeur:SmallInt):SmallInt;Register;Overload;
    Asm
      ROR AX,1
    End;
     
    Function ROR(Valeur:Integer):Integer;Register;Overload;
    Asm
      ROR EAX,1
    End;
    Tu peux aussi l'intégrer directement dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Var Truc:Integer;
    ....
    Truc:=Machine*Bidule;
    Asm
      ROR Truc,1
    End;
    ...
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 13/05/2009, 10h18
  2. Opération sur les bits
    Par Sergio29 dans le forum Débuter
    Réponses: 2
    Dernier message: 24/12/2007, 13h23
  3. Réponses: 3
    Dernier message: 28/07/2006, 10h16
  4. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 20h42
  5. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45

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