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 :

Comment récupérer un nombre codé en binaire


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut Comment récupérer un nombre codé en binaire
    Salut tout le monde
    J'essaye de lire un fichier contenant des valeurs numériques codées en binaire.
    Pour le faire j'ai choisi d'utiliser TfileStream pour pouvoir naviguer facilement dans le fichier.
    Le problème est que avec mes conaissances actuelles en programmation Delphi je suis incapable de transcrire dans une variable integer un nombre entier codé en deux bytes

    Voila ce que j'ai bricole


    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
    Procédure TForm1.Button2Click(Sender: TObject);
     var
         Fichier_Stream : TFileStream;
         x_Bytes :Array of Byte;
     begin
    if opendialog1.Execute then begin
    Edit1.Text:=opendialog1.FileName;
    if not FileExists(Edit1.Text) then exit;
    memo1.clear;
    Application.ProcessMessages;
    Fichier_Stream := TFileStream.Create(Edit1.Text,fmOpenRead);
    SetLength(x_Bytes, 2);
    Fichier_Stream.Seek(0,soFromBeginning) ;
    Fichier_Stream.Read(x_Bytes[0],2);
    ///
    ///          Je bloque ici
    ///   Je souhaiterais, en faite, afficher dans ma memo1 la valeur en décimal de du nombre codée en 2 bytes  x_Bytes
    ///
     
    end;
    end;

    Quelqu’un aurait il un idée pour me débloquer



    Merci

  2. #2
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    en fait, je ne crois pas que les entiers codés sur 2 bits existent sous delphi,mais je ne suis pas un connaisseur en la matiere.
    On a les short sur 1 bits et les integer dont le conage depends du systeme (4 sous windows).

    Tu ne peux donc pas te baser sur la lecture d'un type predefini.
    Par contre, sans que cela soit trop complexe, tu peux lire 2 short de 1 bits que tu combone avec : N := S1*1024+S2.
    Verifie quand meme l'ordre dans lequel sont ecrit les bits dans le fichier (gauche a droite ou droite a gauche)

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    oula ! c'est quoi ce mélange

    l'octet comprend 8 bits et prend les valeurs de 0 à 255

    sous Delphi c'est le "byte" (ou le CHAR pour les caractères)

    2 octets, 16 bits de 0 à 65535 c'est le "word"

    4 octets, 32 bits de 0 à $FFFFFFFF c'est le "cardinal"

    dans les versions signées nous avons respectivement shortint, smallint et integer (depuis Delphi 2, longint et integer sont équivalents)

    et finalement l'entier signé sur 64 bits : int64

    pour en revenir à la question initiale, il faut lire un WORD, qu'éventuellement il faut swapper (fonction SWAP) pour inverser l'ordre des deux octets (petit et grand indien)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Oups !
    Desolé Grand maitre ... je m'incline devant votre savoir ....
    Le petit vermiseau que je suis a encore trop parlé


    Oui j'ai confondu Byte/bits/octets .... surement un reveil un peu trop brutal :p

    Smallint (2 octets c'est ca ?) : j'ai oublié
    Byte (1octet) Word (2octet) et DWord (4cotets) sont des types windows et la j'ai pas encore le reflex

    Donc je corrige mon post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Var 
      FS : TFileStream;
      w : Word;
      smi : SmallInt;
    [..]
    FS.Read(w, SizeOf(DWORD));
    FS.Read(smi, SizeOf(SmallInt));
    Voila 2 solutions pour recuperer un entier codé sur 2 octets/Bytes (et non pas bits )

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut
    Salut,
    Je viens de lire ces trois postes en réponse a ma question Merci pour toute ces précisions.

    Le retard de ma rection est expliqué par le décalage horaire. Je me connecte, enfaîte depuis Geoje Island en curée du sud.

  6. #6
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Voilà plus d'informations sur les types entier standarts que tu ne peux en imaginer :
    (ne faites pas attention au "native", ils le sont tous )
    Code X : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Integer: TSepiIntegerType
      tkInteger;    native;     4 bytes-wide;    alignment: 4
    From -2147483648 to 2147483647 (signed)
    
    Cardinal: TSepiIntegerType
      tkInteger;    native;     4 bytes-wide;    alignment: 4
    From 0 to -1 (unsigned)
    
    Shortint: TSepiIntegerType
      tkInteger;    native;     1 bytes-wide;    alignment: 1
    From -128 to 127 (signed)
    
    Smallint: TSepiIntegerType
      tkInteger;    native;     2 bytes-wide;    alignment: 2
    From -32768 to 32767 (signed)
    
    Longint: TSepiTypeAlias
    -> Integer
    
    Int64: TSepiInt64Type
      tkInt64;    native;     8 bytes-wide;    alignment: 8
    From -9223372036854775808 to 9223372036854775807
    
    Byte: TSepiIntegerType
      tkInteger;    native;     1 bytes-wide;    alignment: 1
    From 0 to 255 (unsigned)
    
    Word: TSepiIntegerType
      tkInteger;    native;     2 bytes-wide;    alignment: 2
    From 0 to 65535 (unsigned)
    
    Longword: TSepiTypeAlias
    -> Cardinal
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 38
    Par défaut
    Pour répondre rapidos à la question initiale :

    Citation Envoyé par amamisou
    Delphi je suis incapable de transcrire dans une variable integer un nombre entier codé en deux bytes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function ByteToWord(High : Byte; Low: Byte) : Word;
    begin
      result := High shl 8;
      result := result + Low;
    end;
    Word étant plus petit que Integer tu peux le mettre dans un Integer
    J'utilise l'operateur shl (Shift Left = Décalage vers la gauche) pour décaler de 8 bits tous les bits du mot.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Par défaut
    Bonjour,

    Je doit faire quasiment la même fonction que amamisou... J'ai essayé de récupérer à partir d'un tableur des valeurs en binaires :
    A1 : 10001110
    A2 : 10100101

    J'ai essayé d'utiliser la fonction que tu as présenté Le Merou et du coup je ne récupère pas les bonnes données

    Voici mon code :

    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
    24
    25
    26
    27
    28
    29
    30
    31
     
    var
      vXLApp: variant;
      vXLWorkbook: variant;
      vXLWorksheet: variant;
     
    function TfmPrinc.ByteToWord(High : Byte; Low: Byte) : Word;
    begin
      result := High shl 8;
      result := result + Low;
    end;
     
     
    procedure TfmPrinc.btConversionClick(Sender: TObject);
    var
    Resultat:Variant;
    MSB, LSB:Byte;
    Conversion:Word;
    begin
    vXLApp := CreateOleObject('Excel.Application');
    vXLApp.Visible:=False;
    vXLWorkbook:=vXLApp.Workbooks.open(sChemin);
    vXLWorksheet:=vXLWorkbook.sheets[1];
    resultat:=vXLWorksheet.Range['A1:A2'].value;
    MSB:=resultat[1,1];
    LSB:=resultat[2,1];
    Conversion:=ByteToWord(MSB,LSB);
    ShowMessage(IntToStr(Conversion));
    vXLApp.Quit;
    vXLApp := unassigned;
    end;
    Est ce que cela ne viendrait pas du fait que Resultat soit de type variant que j'y mette des bytes ?

  9. #9
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut

    Le problème vient certainement du fait que les cellules A1 et A2 sont lues comme des integers.

    Essaye comme ceci:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    uses
      ComObj, Math;
     
    function BinToDec(AValue: string): Word;
    var
      I: Integer;
      C: Char;
    begin
      result := 0;
      for I := 1 to Length(AValue) do
      begin
        C := AValue[i];
        result := result + Trunc(StrToInt(C) * IntPower(2, Length(AValue) - I));
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Resultat: Variant;
      Conversion: Word;
    begin
      vXLApp := CreateOleObject('Excel.Application');
      vXLApp.Visible := False;
      vXLWorkbook := vXLApp.Workbooks.Open(sChemin);
      vXLWorksheet := vXLWorkbook.Sheets[1];
      try
        resultat := vXLWorksheet.Range['A1:A2'].Value;
        Conversion := BinToDec(IntToStr(resultat[1,1]) + IntToStr(resultat[2,1]));
        ShowMessage(IntToStr(Conversion));
      finally
        vXLApp.Quit;
        vXLApp := unassigned;
      end;
    end;
    @+ Claudius

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Par défaut
    Ok merci je vais tester !

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 11
    Par défaut
    Ok merci çà marche, c'est vrai que çà ne pouvais pas trop marcher étant donné que je récupérais des chaines de caractères !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/12/2006, 09h39
  2. Comment récupérer le nombre d'enregistrements effacés ?
    Par Jérôme Lambert dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/10/2006, 09h22
  3. Réponses: 3
    Dernier message: 17/08/2006, 12h03
  4. Réponses: 6
    Dernier message: 14/06/2006, 16h55
  5. Réponses: 1
    Dernier message: 08/11/2005, 14h40

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