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 :

Avoir les 16 bytes de poids fort


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut Avoir les 16 bytes de poids fort
    Bonjour tout le monde et bonne année pour commencer !

    On me demande de prendre les 16 MSB (Most Significant Bytes = octets de poids fort) dans un Array[0..31] of BYTE (de 32 bytes donc), comment dois-je procéder ?

    Nom : Capture.PNG
Affichages : 1518
Taille : 18,5 Ko

    Je vous remercie d'avance !!

    [EDIT = correction bytes/bits effectuée]

  2. #2
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := Copy(myDigestSha2, 15, 16);
    EDIT : Attention, 16 bits <> 16 Bytes. Pour 16bits (et donc sur un Cardinal par exemple) : Result := HiWord(MyInteger)

  3. #3
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Oui autant pour moi, le bit dans le titre de la discussion est mal dit. C'est bien un Byte.

    [EDIT = et donc corrigé]

  4. #4
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Copy(myDigestSha2, 15, 16);
    Il me dit que myDigestSha2 est incompatible (je suis sous Delphi 2007)

  5. #5
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    En fait prendre les 16 bits de poid fort ça consiste à prendre les 16 premiers octets ?

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    ca dépend si ton tableau est en big-endian ou little-endian. Sous windows, les nombres sont en little-endian (ie. le bit de poids faible au début), mais toi c'est un tableau de byte, donc seul la personne qui te fournit le tableau sait de quelle manière il est codé. Le code que je t'ai donné est pour du little-endian (le dernier élément de ton tableau est le plus fort), donc on copie 16 éléments à partir du 15 (donc les 16 derniers). Il n'est d'ailleur pas bon car il faut prendre à partir du 16eme, pas le 15eme; mais effectivement Copy ne fonctionne pas avec les tableaux statiques. Du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetLength(Result, 16); //Result étant un "array of Byte"
    CopyMemory(@Result[0], @myDigestSha2[16], 16 * SizeOf(Byte));

  7. #7
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Merci pour ses précieux renseignements, à vrai dire le tableau de BYTE c'est moi qui le rempli à partir de plusieurs variables (c'est pour du hachage ), pour être concret :

    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
     
    var
    s_test, myHash_sha256 : AnsiString;
    myDCP_sha2: TDCP_sha256;
    myDigestSha2: Array[0..31] of BYTE;
    aby_alea: Array of BYTE;
    begin
    s_test := ELogin.Text + EPassword.Text + ENameInstitut.Text + 'D207CF0258DB61D87A8498F58DF1C15CA04B5A42A69AD99BA243CEF45CCB00E55CDBC9B2711D26B645382B7275AD1851';
     
    myDCP_sha2 := TDCP_sha256.Create(nil);
    myDCP_sha2.Burn;
    myDCP_sha2.Init;
    myDCP_sha2.UpdateStr(s_test);
    myDCP_sha2.Final(myDigestSha2);
     
    myHash_sha256 := '';
    for i_cpt:= 0 to 15 do
      myHash_sha256 := myHash_sha256 + IntToHex(myDigestSha2[i_cpt],2);
     
    SetLength(aby_alea, 16); //Result étant un "array of Byte"
    CopyMemory(@aby_alea[0], @myDigestSha2[16], 16 * SizeOf(Byte));

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Avec des fonctions de décalage :

    a:=b shr 16;// équivalent à /2^16 = /65536

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 507
    Points
    15 507
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par phoenixgreg Voir le message
    En fait prendre les 16 bits de poid fort ça consiste à prendre les 16 premiers octets ?
    Bonjour ! "Bit" (qui est la contraction de "binary digit"), c'est un chiffre binaire. "Byte", c'est un octet, c'est-à-dire huit bits.

  10. #10
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Oui autant pour moi ! Mais cela ne répond pas à ma question, qu'est-ce que concrètement prendre les 16 MSB ?

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    le MSB corespond au chiffre en partant de la gauche dans un nombres binaire donc le premier

    Par exemple si tu as 9 en binaire le MSB est 1
    les deux MSB seras 10 et ainsi de suite

    si je traduit ta demande tu veut les 16 premiers octet dans dans un tableau qui en comportant 32 ?

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Ce n'est qu'une question de déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type
      TMyDigestSha2 = record
        case integer of
          0 : (Full :array[0..31] of byte);
          1 : (LSB  :array[0..15] of byte;
               MSB  :array[0..15] of byte);
      end;
     
    var
      MyDigestSha2 :TMyDigestSha2;

  13. #13
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    En effet je comprend mieux donc la déclaration dans mon cas sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MSB  :array[0..15] of byte
    pour obtenir mes 16 octets de poid fort.

    Merci !

  14. #14
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par phoenixgreg Voir le message
    En effet je comprend mieux donc la déclaration dans mon cas sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MSB  :array[0..15] of byte
    pour obtenir mes 16 octets de poid fort.

    Merci !
    Non, ce que te propose AndNotOr est une record variable.
    Les 2 cas du case représentent le meme emplacement mémoire, vu de manière différente.
    Soit tu vois le tableau full, soit le MSB et le LSB
    En prenant une chaine ce sera plus clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      TMaChaine = record
        case integer of
          0 : (Full :array[0..7] of char);
          1 : (LSB  :array[0..3] of char;
               MSB  :array[0..3] of char);
      end;
    ce record a une taille de 8 octets
    Si tu remplis le tableau full avec 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', alors le tableau LSB sera ('A', 'B', 'C', 'D') et le MSB ('E', 'F', 'G', 'H').
    Faire MaChaine.Full[5] := 'X'; équivaut à faire MaChaine.MSB[1] := 'X';Mais tu peux aussi avoir des types différents, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      TDiffType = record
        case integer of
          0 : (InChar : array[0..3] of AnsiChar);
          1 : (InByte : array[0..3] of Byte);
          2 : (InInt   : Integer);
      end;
    Dans ce cas, si ton tableau contient InChar ('A', 'B', 'C', 'D'), InByte contient (65, 66, 67, 68), et InInt contient le int composé de ces valeurs

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 851
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 851
    Points : 15 268
    Points
    15 268
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      TMaChaine = record
        case integer of
          0 : (Full :array[0..8] of char);
          1 : (LSB  :array[0..3] of char;
               MSB  :array[0..3] of char);
      end;
    ce record a une taille de 8 octets

    Ou alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      TMaChaine = record
        case integer of
          0 : (Full :array[0..7] of char); // 0..7 --> 8 positions !
          1 : (LSB  :array[0..3] of char;
               MSB  :array[0..3] of char);
      end;
    Et pareil dessous pour les machins [0..4] qui ont donc 5 positions

  16. #16
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    houlala merci jipété ... j'ai honte
    je modifie mon message précédent pour éviter toute confusion

  17. #17
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Dernier détail : MaChaine.Full[5] = MaChaine.LSB[1];.

    Attention au char aussi, ansichar pour être sûr

  18. #18
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Dernier détail : MaChaine.Full[5] = MaChaine.LSB[1];.
    Heuuu non. Les 4 premiers sont dans LSB, le 6eme de full est le 2eme de MSB. TU m'as mis le doute donc j'ai testé, et c'est bien ca. En D7 :
    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
      TMaChaine = record
        case integer of
         0: (full: array[0..7] of char);
         1 : (lsb: array[0..3] of char;
              msb: array[0..3] of char);
      end;
    ...
    var
      mc: TMaChaine;
    begin
      mc.full := 'ABCDEFGH';
      ShowMessageFmt('full:"%.8s"; lsb:"%.4s"; msb:"%.4s"', [mc.full, mc.lsb, mc.msb]); // ----> full:"ABCDEFGH"; lsb:"ABCD"; msb:"EFGH"
      mc.full[5] := 'X';
      mc.lsb[0] := 'Y';
      ShowMessageFmt('full:"%.8s"; lsb:"%.4s"; msb:"%.4s"', [mc.full, mc.lsb, mc.msb]); // ----> full:"YBCDEXGH"; lsb:"YBCD"; msb:"EXGH"
    end;
    Citation Envoyé par Andnotor Voir le message
    Attention au char aussi, ansichar pour être sûr
    Effectivement. Pour le 1er cas (TMaChaine), tout est char, donc Ansi ou Wide, pas de différence (juste la taille du record 8/16 o ). Pour le 2eme par contre c'est pas la même, je corrige.

  19. #19
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Au temps pour moi

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

Discussions similaires

  1. Bit de poid fort et faible dans un unsigned short
    Par phoenixgreg dans le forum C
    Réponses: 3
    Dernier message: 05/12/2016, 15h04
  2. Comment avoir l'octet de poids fort et faible d'un nombre
    Par azerty25 dans le forum Général Python
    Réponses: 7
    Dernier message: 02/12/2015, 16h41
  3. Réponses: 3
    Dernier message: 12/01/2011, 11h51
  4. inversion de bits (poid faible / poid fort)
    Par damdam78 dans le forum C++
    Réponses: 2
    Dernier message: 04/03/2009, 18h17
  5. Bit de poids Fort
    Par Macno dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/07/2007, 23h40

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