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 :

Charger un fichier dans tableau d'entier


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 19
    Points : 13
    Points
    13
    Par défaut Charger un fichier dans tableau d'entier
    Bonjour,

    J'aimerai connaître la syntaxe du code permettant de charger le contenu d'un fichier dans un array of Integer.

    Mon fichier est celui-ci:
    44 49 41 10 61 05 06 10 10 00 01 00 86 00 00 01
    00 00 00 00 45 54 41 20 45 53 30 32 20 20 69 05
    09 21 13 31 91 2e ff 96 d6 00 00 0a a7 00 05 31
    74 13 31 51 50 80 00 c8 a0 56 31 20 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 14 47 a6 80 00 5e
    3a 7c 20 45 74 61 74 20 43 68 61 ee 6e 65 a0 3a
    20 27 53 74 61 6e 64 62 79 27 20 20 20 20 20 20
    20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
    20 20 20 20 fa 9c
    Ce sont des valeurs héxadécimales que je dois envoyer par TCP vers un serveur. J'ai essayé de les charger dans un Memo ou dans un StringList mais j'ai toujours le même pb, ces valeurs sont changées en ASCII lors de l'envoi par TCP...Alors mon dernier espoir est de les charger dans un tableu d'entiers.

    HELP !!

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Ton fichier, c'est un fichier texte avec les valeurs écrite comme ça, ou bien c'est un fichier binaire contenant une suite d'octet dont tu nous représente ici les valeurs héxadécimales ?

    parce que '6e' dans un fichier texte n'a jamais représenté, dans un fichier texte, autre chose que la suite de caractères '6' suivi de 'e'.

    pour transformer la chaîne '6e' en entier (c'est à dire 110), il faut que tu utilise par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function HexToInt(HexStr: String): Integer;
    begin
      result := StrToInt('$' + HexStr);
    end;
    ...
    var TonEntier:integer;
    ...
    TonEntier:=HexToInt('6e');
    Bidouilleuse Delphi

  3. #3
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Sinon, il y a aussi une fonction HexToBin en Delphi qui utilise des PChar, qui doit être pas mal pour convertir un lot de valeurs Héxadécimale, mais il ne faut pas se planter sur les tailles de tableaux et les conversions de type...
    Bidouilleuse Delphi

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Je te remercie de ta réponse.

    Pour être plus clair:
    les valeurs que j'ai donné en exemple sont des valeurs héxadécimales, lorsque je les ai chargées dans un Memo ou une StringList puis envoyées par TCP vers l'appli serveur, ces valeurs ont été comprises comme étant des données de type ASCII puisque l'appli serveur m'a ressortie '34 34 20 34 39 20 34 31...' au lieu de '44 49 41', c'est à dire que lors de l'envoi les valeurs sont changées en Héxa alors que c'est déjà de l'héxa!!!
    Je pense qu'étant donnée que le contenu d'un Memo ou d'une StringList sont de type Text, les données sont envoyées comme tel...J'avoue que je suis un peu perdu...

    Merci

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Re bonjour,

    En fait je viens de comprendre, l'appli serveur fait une traduction des données qu'elle reçoit en Héxa, par conséquent je dois charger mon fichier, puis le traduire en ASCII, ainsi lorsque l'appli recevra les données ele fera la conversion inverse.

    Physiquement on va avoir le processus suivant:

    HEXA --> ASCII
    Mon fichier | Je le traduit en ASCII
    contient de l'Héxa |

    L'appli, elle va fair ele processus inverse, ainsi j'avais de l'Héxa au départ dans mon fichier, j'aurai bien de l'héxa après la réception de l'appli.

    Par conséquent comment traduire:
    44 49 41 10 61 05 06 10 10 00 01 00 86 00 00 01
    00 00 00 00 45 54 41 20 45 53 30 32 20 20 69 05
    09 21 13 31 91 2e ff 96 d6 00 00 0a a7 00 05 31
    74 13 31 51 50 80 00 c8 a0 56 31 20 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 14 47 a6 80 00 5e
    3a 7c 20 45 74 61 74 20 43 68 61 ee 6e 65 a0 3a
    20 27 53 74 61 6e 64 62 79 27 20 20 20 20 20 20
    20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
    20 20 20 20 fa 9c
    En ASCII ????

    Merci

  6. #6
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Edit : no posts se sont croisé et mon post concerne ton avant dernier message,
    Pour ton dernier message c'est à peu près ça effectivement

    Ha je vois, non ce que tu envois, ce n'est pas de l'hexa mais bien du texte.

    En fait tu confond ce que toi, tu te représentes en héxa et ce qu'est un héxadécimal pour un ordinateur.

    En fait, un ordinateur ne sait absolument pas faire la différence entre un héxadécimal, un binaire ou un décimal ou un caractère : pour lui c'est la même chose !
    Pour lui, c'est par exemple une valeur stockée sur 8 bits, 16 bits, 32 bits et c'est tout ce qui compte.

    Toi, tu lui fourni en l'occurence une suite d'octets (les valeurs ascii pour '4', '4', ' ', '4', '9', ' ', '4', '1').

    Ce qu'il faut que tu comprennes c'est que le type String est un tableau d'octet, par exemple si tu déclare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var s:string;
                   c:char;
                   b:byte;
    begin
      s:='Bonjour';  
      c:=s[1]; //<--- c contient 'B';
      b:=s[1]; //<--- b contient 66 (valeur Ascii de 'B')
    end;
    s[0], s[1], s[2],, s[3], etc.. sont des cases qui contiennent individuellement des octets.

    Tu peux au choix te les représenter dans Delphi comme des types char, ou comme des types byte, pour l'ordinateur la finalité et la même.

    s[0] contiendra la longueur de la chaîne (Commentaire pour les puristes sinon ils vont râler : si on utilise des chaînes courtes...)
    s[1] contiendra 66, ou 'B' ça dépend si tu choisis de le représenter en Char ou en valeur ASCII brute.
    etc...

    donc maintenant, si tu as :
    s, sera comme un tableau d'octets contenant la valeur ASCII de '4', puis celle de '4', puis celle de ' ', puis celle de '4', puis celle de '9', et ainsi de suite.

    donc si tu envois s par réseau, tu envois bien les valeurs successives 34,34,20,34,39 etc...

    Maintenant, regarde les exemples suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var i:byte;
    begin
      // les trois lignes suivantes font la même chose;
      i:=65;
      i:=ord('A');
      i:=$41;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var c:char;
    begin
       // les trois lignes suivantes font la même chose;
      c:=chr(65);
      c:='A';
      c:=chr($41);
    end;
    ce sont deux façons différentes de stocker une valeur identique sur un octet. Pour toi c'est différent, pour l'ordinateur c'est pareil à l'arrivée.

    Par contre dans le cas qui nous intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var i:byte;
                  s:string[2];
    begin
      i:=65;
      s:='65';
    end;
    .. les deux lignes ne veulent pas du tout dire la même chose pour l'ordinateur !

    A toi donc, d'envoyer correctement ton '65' héxadécimal correctement en l'ayant au préalable transformé en véritable entier stocké sur 8 bits, ou bie à la réception sur le serveur de réceptionner le tableau d'entiers puis de le reconvertir en chaine de caractères.

    Dans le premier cas (envoi):
    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
    var s:string;
         i,j:integer;
         TableHexa:array[0..2] of string[2];
         TableEntiers:array[0..2] of byte;
    begin
    ...
    //Memo1.Text contient '44 49 41'
    //on supprime les espaces en stockant dans s
    s:=''; //initialisation
    for i:=1 to length(Memo1.Text) do
       if Memo1.Text[i]<>' ' then s:=s+Memo1.Text[i];
     
    //on initialise TableHexa
    for i:=0 to 2 do TableHexa[i]:='';
    //On stocke '44', '49' et '41' dans un tableau de chaines de deux
    //caractères de long
    i:=1;
    j:=0;
    while (i<length(s)) do
    begin
       TableHexa[j]:=s[i]+s[i+1];
       inc(j);
       inc(i,2);
    end;
     
    //On transforme nos valeurs Hexa pour les mettre dans le Tableau d'entiers. avec la procédure HexToInt que je t'ai fourni dans le post précédent.
    for i:=0 to 2 do
     TableEntiers[i]:=HextoInt(TableHexa[i]);
     
    //Tu envois ton tableau d'entiers par le réseau
    ...
    end;
    Ou bien, dans le 2ème cas (réception):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var s:string;
         i:integer;
         TableEntiers:array[0..2] of byte;
    begin
    ...
    //Tu as reçu un table d'entier 34,34,20,34,39,20,34,31...' au lieu de '44 49 41' (et c'(est normal) dans TableEntiers
     
    s:=''; //initialisation
    for i:=0 to 2 do
      s:=s+chr(TableEntiers[i];
     
    //Il n'y a plus qu'a afficher s qui contient bien '44 49 41'
    J'espère que ça t'aideras
    Bon courage[/code]
    Bidouilleuse Delphi

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Merci bcp pour cette longue explication...
    Seulement comme tu as pu le lire dans mon dernier post, il ne me reste en fait qu'à traduire les données de mon fichier en ascii.
    Soit traduire la chaîne :

    44 49 41 10 61 05 06 10 10 00 01 00 86 00 00 01
    00 00 00 00 45 54 41 20 45 53 30 32 20 20 69 05
    09 21 13 31 91 2e ff 96 d6 00 00 0a a7 00 05 31
    74 13 31 51 50 80 00 c8 a0 56 31 20 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 14 47 a6 80 00 5e
    3a 7c 20 45 74 61 74 20 43 68 61 ee 6e 65 a0 3a
    20 27 53 74 61 6e 64 62 79 27 20 20 20 20 20 20
    20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
    20 20 20 20 fa 9c

    en Ascii.

    Connaîs tu la syntaxe?

  8. #8
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Non, il n'y a pas de syntaxe particulière toute faite, autrement dit il faut que tu te fasse ta procédure tout seul comme un grand.

    Pour rappel je t'ai proposé ça, qui transforme deux caractères censés représenter un code Hexa en octet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function HexToInt(HexStr: String[2]): byte;
    begin
      result := StrToInt('$' + HexStr);
    end;
    ...
    var TonEntier:integer;
    ...
    TonEntier:=HexToInt('6e');
    et ça, qui, qui te transforme 3 hexadécimaux stockés sous représentation chaîne de caractè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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    var s:string;
         i,j:integer;
         TableHexa:array[0..2] of string[2];
         TableEntiers:array[0..2] of byte;
    begin
    ...
    //Memo1.Text contient '44 49 41'
    //on supprime les espaces en stockant dans s
    s:=''; //initialisation
    for i:=1 to length(Memo1.Text) do
       if Memo1.Text[i]<>' ' then s:=s+Memo1.Text[i];
     
    //on initialise TableHexa
    for i:=0 to 2 do TableHexa[i]:='';
    //On stocke '44', '49' et '41' dans un tableau de chaines de deux
    //caractères de long
    i:=1;
    j:=0;
    while (i<length(s)) do
    begin
       TableHexa[j]:=s[i]+s[i+1];
       inc(j);
       inc(i,2);
    end;
     
    //On transforme nos valeurs Hexa pour les mettre dans le Tableau d'entiers. avec la procédure HexToInt que je t'ai fourni dans le post précédent.
    for i:=0 to 2 do
     TableEntiers[i]:=HextoInt(TableHexa[i]);
     
    //Tu envois ton tableau d'entiers par le réseau
    ...
    end;
    Bref, il n'y a plus qu'a agrandir les tablaux, mettre ça dans une procedure et hop !
    si avec ça tu ne peux pas faire ce que tu veux, c'est que tu grille les étapes dans ton apprentissage de Delphi.
    C'est pas toujours bon de vouloir construire un chateau sans avoir appris à tailler une pierre (pas d'accord ?)
    Bidouilleuse Delphi

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 28
    Points
    28
    Par défaut
    Bonsoir,

    Je fais remonter cet ancien fil, car sous D7 le code suivant du post#6 ne fonctionne pas, j'ai une erreur qui mentionne une incompatibilité de type de données...

    Je suis obligé de passer par la fonction POS pour avoir le même résultat dans la variable 'b' de ce bout de code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var s:string;
                   c:char;
                   b:byte;
    begin
      s:='Bonjour';  
      c:=s[1]; //<--- c contient 'B';
      b:=s[1]; //<--- b contient 66 (valeur Ascii de 'B') 
    end;
    Y a t'il une solution plus simple que la fonction POS (en fait du même style que la fonction ci-dessus) pour obtenir la valeur du caractère ?

    Merci.

    David.

  10. #10
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    Citation Envoyé par DavidDB Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var s:string;
                   c:char;
                   b:byte;
    begin
      s:='Bonjour';  
      c:=s[1]; //<--- c contient 'B';
      b:=s[1]; //<--- b contient 66 (valeur Ascii de 'B') 
    end;
    Y a t'il une solution plus simple que la fonction POS (en fait du même style que la fonction ci-dessus) pour obtenir la valeur du caractère ?
    oui, il s'agit de faire un Cast:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var s:string;
                   c:char;
                   b:byte;
    begin
      s:='Bonjour';  
      c:=s[1]; //<--- c contient 'B';
      b:=Byte(s[1]); //<--- b contient 66 (valeur Ascii de 'B') 
    end;

  11. #11
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Points : 28
    Points
    28
    Par défaut
    Salut,

    Merci, cela fonctionne très bien et en plus c'est plus parlant que la fonction POS...

    David.

  12. #12
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par DavidDB Voir le message
    Merci, cela fonctionne très bien et en plus c'est plus parlant que la fonction POS...

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 460
    Points : 24 877
    Points
    24 877
    Par défaut
    Je pense que ce sujet pourrait intéresser, voire ma fonctionHexaStringToBinFile, ce n'est pas une réponse au problème mais pourrait aider nico0007 a mieux cerner fichier binaire, ascii, ...
    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

Discussions similaires

  1. Charger un fichier dans un tableau de structures
    Par ysahel dans le forum Débuter
    Réponses: 7
    Dernier message: 17/01/2010, 13h18
  2. charger un fichier dans un tableau
    Par siempre dans le forum C
    Réponses: 12
    Dernier message: 20/11/2009, 09h15
  3. charger un fichier dans un tableau
    Par nico0007 dans le forum Delphi
    Réponses: 3
    Dernier message: 16/01/2007, 23h59
  4. Charger un fichier dans une table
    Par luchot dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 07/02/2006, 17h21
  5. Charger un fichier dans une textarea
    Par boux2 dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2006, 16h16

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