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 :

Equivalent de la fonction basic CVS MKS$


Sujet :

Langage Delphi

  1. #1
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut Equivalent de la fonction basic CVS MKS$
    Bonjour,

    Je dois lire un fichier qui a été généré par un programme gwbasic (DOS).
    Celui ci est composé des zones textes que je peux facilement récupérer et de zones 'binaires' contenant un réel simple précision.

    D'après ce que je comprend en gwbasic pour enregistrer un réel dans une zone de fichier on utilise la fonction MKS$ qui convertie le réel simple précision en une chaine de caractère sur 4 positions.

    Ce procédé est utilisé car on ne peut enregistrer autre chose que des chaines dans un fichier gwbasic.

    Pour relire cette zone on utilise CVS qui converti ces 4 caractères en réel simple.

    J'aimerai pouvoir lire ce fichier depuis Delphi.

    J'ai essayé de créer un record :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    EnrTest = record
      NOM     : array[1..20] of char;
      Chiffre : array[1.. 4] of byte;
    end;
    J'ai un fichier et un enregistrement courant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Fichier : File of EnrTest;
    CurEnr  : EnrTest;
    Je lits un enregistrement après m'être positionné dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    seek(Fichier, 2);
    read(Fichier, CurEnr);
    Pour la lecture de la zone texte, pas de probleme par contre le chiffre...
    J'ai essayé de caster en single :
    mais ca ne donne pas le bon résultat.
    J'ai affiché la valeur de chaque byte pour voir comment il pouvait être encodé, mais j'ai l'impression que l'encodage binaire n'est pas simple.

    par exemple la valeur 100 (décimal) enregistré dans le fichier avec le programme basic donne ceci dans mes 4 octets (en hexa) :
    en binaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0000 0000    0000 0000    0100 1000    1000 0111
    -100 donne :
    en binaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0000 0000    0000 0000    1100 1000    1000 0111
    j'en conclus que le signe est sur le 1er bit du 3 eme octet. Et que probablement le 3eme et 4eme octets sont les poids forts (héritage de l'architecture 8088 ?)

    Mais pour le reste...
    la valeur 1 est encodée comme ceci : 0 0 0 81h
    la valeur -1 est encodée comme ceci : 0 0 80h 81h
    la valeur 2 est encodée comme ceci : 0 0 0 82h
    la valeur 4 est encodée comme ceci : 0 0 0 83h
    la valeur 8 est encodée comme ceci : 0 0 0 84h
    la valeur 16 est encodée comme ceci : 0 0 0 85h
    la valeur 32 est encodée comme ceci : 0 0 0 86h
    la valeur 64 est encodée comme ceci : 0 0 0 87h
    la valeur 128 est encodée comme ceci : 0 0 0 88h
    la valeur 256 est encodée comme ceci : 0 0 0 89h
    la valeur 512 est encodée comme ceci : 0 0 0 8Ah
    la valeur 1024 est encodée comme ceci : 0 0 0 8Bh
    la valeur 2048 est encodée comme ceci : 0 0 0 8Ch
    la valeur 4096 est encodée comme ceci : 0 0 0 8Dh
    la valeur 8192 est encodée comme ceci : 0 0 0 8Eh
    la valeur 16384 est encodée comme ceci : 0 0 0 8Fh
    la valeur 32768 est encodée comme ceci : 0 0 0 90h
    la valeur 65535 est encodée comme ceci : 0 0 0 91h

    La valeur 3 est encodée comme ce ci : 0 0 40h 82h

    La valeur 5 est encodée comme ce ci : 0 0 20h 83h
    La valeur 6 est encodée comme ce ci : 0 0 40h 83h
    La valeur 7 est encodée comme ce ci : 0 0 60h 83h

    La valeur 9 est encodée comme ce ci : 0 0 10h 84h
    La valeur 10 est encodée comme ce ci : 0 0 20h 84h
    La valeur 11 est encodée comme ce ci : 0 0 30h 84h
    La valeur 12 est encodée comme ce ci : 0 0 40h 84h
    La valeur 13 est encodée comme ce ci : 0 0 50h 84h
    La valeur 14 est encodée comme ce ci : 0 0 60h 84h
    La valeur 15 est encodée comme ce ci : 0 0 70h 84h

    La valeur 17 est encodée comme ce ci : 0 0 08h 85h

    Bref je ne trouve pas la logique d'encodage.

    Quelqu un aurait il plus d'expérience dans ce domaine ou mieux une solution .

    Merci d'avoir lu jusqu ici. Si vous avez des questions, n'hézitez pas à demander des précisions.

  2. #2
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Bonsoir.

    Si c'est un fichier CSV, il est éditable (visible) avec le bloc note de WINDOWS.
    Peux tu me transmetre le fichier en question ?

    Je pourais mieux te répondre.

    A+
    Rien n'est moins sur que l'incertain : Pierre DAC

  3. #3
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Non celà n'a rien a voir avec un fichier CSV.
    et je ne parle pas non plus du controleur de source CSV


    Je cherche a convertir 4 octets binaires en une valeur.

    La difficultée est que le codage de des 4 octets est réalisé par la fonction basique MKS$ dont je ne connais pas le détail.

    En basic (le langage) il existe une fonction qui s'appelle CVS (et non CSV) et elle permet de décoder ces 4 octets.

    Cordialement

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 948
    Points
    3 948
    Par défaut
    Hi man

    Bon courage

    Pourquoi ne pas écrire un programme BASIC qui relise les données et les convertisse en texte ? Après c'est relativement simple

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Quand on met les infos en forme, comme ça :
    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
       -1 est encodée comme ceci : 0 0 80h 81h
     
        1 est encodée comme ceci : 0 0 00h 81h
        2 est encodée comme ceci : 0 0 00h 82h
        3 est encodée comme ceci : 0 0 40h 82h
        4 est encodée comme ceci : 0 0 00h 83h
        5 est encodée comme ceci : 0 0 20h 83h
        6 est encodée comme ceci : 0 0 40h 83h
        7 est encodée comme ceci : 0 0 60h 83h
        8 est encodée comme ceci : 0 0 00h 84h
        9 est encodée comme ceci : 0 0 10h 84h
       10 est encodée comme ceci : 0 0 20h 84h
       11 est encodée comme ceci : 0 0 30h 84h
       12 est encodée comme ceci : 0 0 40h 84h
       13 est encodée comme ceci : 0 0 50h 84h
       14 est encodée comme ceci : 0 0 60h 84h
       15 est encodée comme ceci : 0 0 70h 84h
       16 est encodée comme ceci : 0 0 00h 85h
       17 est encodée comme ceci : 0 0 08h 85h
     
       32 est encodée comme ceci : 0 0 00h 86h
       64 est encodée comme ceci : 0 0 00h 87h
      128 est encodée comme ceci : 0 0 00h 88h
      256 est encodée comme ceci : 0 0 00h 89h
      512 est encodée comme ceci : 0 0 00h 8Ah
     1024 est encodée comme ceci : 0 0 00h 8Bh
     2048 est encodée comme ceci : 0 0 00h 8Ch
     4096 est encodée comme ceci : 0 0 00h 8Dh
     8192 est encodée comme ceci : 0 0 00h 8Eh
    16384 est encodée comme ceci : 0 0 00h 8Fh
    32768 est encodée comme ceci : 0 0 00h 90h
    65535 est encodée comme ceci : 0 0 00h 91h
    on dirait qu'il y a une logique.
    Qu'est ce qu'elle dit, la doc de la fonction ?
    Mes 2 cts,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2003
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    bonsoir,

    tiens, si ça peut aider, Microsoft propose une dll qui peut à priori transformer les nombres du format MBF au format IEEE.
    http://support.microsoft.com/kb/140520/en-us

    L'exemple devrait être transposable en Delphi.

    Manu

    [edit] une version 32bits : ici
    et quand on sait finalement quoi chercher on peut trouver ça :Chez Borland[/edit]

    J'espère que ça poura aider. !

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 33
    Points : 36
    Points
    36
    Par défaut
    code hexa = A B C D avec A,B,C,D en décimal

    abs(N) = (1+C/128)*2^(D-129)
    sign(N) = sign(C-128)

    Cette formule n'est valable que jusqu'à 256 mais en regardant comment ça se passe pour des nombres un peu plus grand, il doit être facile d'en déduire une règle générale...

  8. #8
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par e-ric
    Hi man

    Bon courage

    Pourquoi ne pas écrire un programme BASIC qui relise les données et les convertisse en texte ? Après c'est relativement simple

    e-ric
    C'est dans le cadre d'une migration de l'application.

    Pour éviter de devoir migrer tous les modules d'un coup, je ne peux pas toucher aux fichiers existants.

    Sinon en effet c'était le plus simple.

  9. #9
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par Jipété
    Quand on met les infos en forme, comme ça :on dirait qu'il y a une logique.
    Qu'est ce qu'elle dit, la doc de la fonction ?
    Mes 2 cts,
    --
    jp
    oui mais en les mettant dans cet ordre j'influence certainement la facon d'aborder le probleme.

    En plus je n'ai mis que des cas simples. Si je mets des exemple avec des décimales ca complique.

  10. #10
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par ejaecker
    bonsoir,

    tiens, si ça peut aider, Microsoft propose une dll qui peut à priori transformer les nombres du format MBF au format IEEE.
    http://support.microsoft.com/kb/140520/en-us

    L'exemple devrait être transposable en Delphi.

    Manu

    [edit] une version 32bits : ici
    et quand on sait finalement quoi chercher on peut trouver ça :Chez Borland[/edit]

    J'espère que ça poura aider. !
    Je regarde ca tout dessuite. Merci
    J'avais trouvé sur le site de microsoft un exemple mais il ne fonctionnait pas car il était basé sur le type d'encodage de VB.

    Merci je vous tiens au courant.

  11. #11
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par Vinchou
    code hexa = A B C D avec A,B,C,D en décimal

    abs(N) = (1+C/128)*2^(D-129)
    sign(N) = sign(C-128)

    Cette formule n'est valable que jusqu'à 256 mais en regardant comment ça se passe pour des nombres un peu plus grand, il doit être facile d'en déduire une règle générale...
    Je ne crois pas que celà fonctionne pour la valeur 17.

    Je regarde la solution d'ejaecker qui nous évitera d'élaborer un algorithme qui n' a pas l'air simple.

  12. #12
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    C'était bien ce format, je n'ai pas eut besoin de la DLL.
    Le format utilisé par le basic DOS est bien celui décrit comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       /* MS Binary Format                         */
       /* byte order =>    m3 | m2 | m1 | exponent */
       /* m1 is most significant byte => sbbb|bbbb */
       /* m3 is the least significant byte         */
       /*      m = mantissa byte                   */
       /*      s = sign bit                        */
       /*      b = bit                             */
       sign = msbin[2] & 0x80;      /* 1000|0000b  */
    Et le format standard ieee :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       /* IEEE Single Precision Float Format       */
       /*    m3        m2        m1     exponent   */
       /* mmmm|mmmm mmmm|mmmm emmm|mmmm seee|eeee  */
       /*          s = sign bit                    */
       /*          e = exponent bit                */
       /*          m = mantissa bit                */
    Pour convertir ca en utilisant Delphi :

    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
    type TArray4B = array [0..3] of byte; 
    function fmsbintoieee(const src4: single): single; 
    var 
      msbin: TArray4B absolute src4; 
      dest4 : single;
      ieee: TArray4B absolute dest4; 
      sign: byte; 
      ieee_exp: byte; 
    begin 
       Result := 0; 
       sign := msbin[2] and $80; 
       FillChar(ieee, sizeof(ieee), 0); 
       if (msbin[3] = 0) then exit; 
       ieee[3] :=  ieee[3] or sign; 
       ieee_exp := msbin[3] - 2; 
       ieee[3] := ieee[3] or (ieee_exp shr 1); 
       ieee[2] := ieee[2] or (ieee_exp shl 7); 
       ieee[2] := ieee[2] or (msbin[2] and $7f); 
       ieee[1] := msbin[1]; 
       ieee[0] := msbin[0]; 
      Result := dest4;
    end;
    Inspiré du source trouvé ici

    Merci à tous et surtout à ejaecker qui m'a bien orienté.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    salut tous le monde

    j'ai presque le même problème, un fichier de données d'un logiciel de comptabilité généré par QBasic, dont les 52 premiers caractères sont lisibles (compte, date, libellé, journal, débit/crédit) puis 12 caractères non lisibles (binaires ???)

    je veux converter ce fichier vers un autre logiciel de comptabilité (sous Windows) qui peut importer à partir d'un fichier .txt

    quelqu'un peut m'aider pour commencer ? (surtout monsieur Barbibulle)

    j'ai jointé avec cette post un fichier de modèle

    merci en avance
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 23/10/2008, 13h58
  2. [PEAR][DB] Equivalent de la fonction "mysql_field_name()
    Par o151181 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 20/09/2005, 17h16
  3. Réponses: 9
    Dernier message: 24/05/2005, 16h34
  4. Equivalent de la fonction d'agregat LIST ?
    Par rahan15 dans le forum SQL
    Réponses: 5
    Dernier message: 10/12/2004, 22h21
  5. Equivalent de la fonction trim
    Par PCHINK dans le forum C
    Réponses: 6
    Dernier message: 21/03/2004, 18h02

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