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

C++Builder Discussion :

conversion ASCII vers EBCEDIC [Non suivi]


Sujet :

C++Builder

  1. #1
    Mü est déconnecté
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 20
    Points : 14
    Points
    14
    Par défaut conversion ASCII vers EBCEDIC
    Bonjour à tous,

    Je reçois tout les jours des fichiers venant d'un AS400.
    Lorsque je les ouvre avec UltraEdit, les valeurs hexadécimales de certains caratères sont mauvaises. Par contre, lorsque je converti d'ASCII vres EBCEDIC, j'obtient les valeurs Hexa que j'attendais.

    Donc, il s'agit d'un problème de conversion de mon fournisseur.
    Quelqu'un peut me dire comment je peux transformer une valeur ASCII vers EBCEDIC?

    Merci d'avance.

  2. #2
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    Il n' y a pas de compatibilité entre ASCII et EBCDIC,

    il faut donc utiliser une table de conversion:

    voici en exemple de tables :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    // AsciiEbcdic.h
    // tables de conversion ASCII->EBCDIC // EBCDIC -> ASCII
    // par Djob.
     
    // il peut y avoir quelques erreurs...
     
     
    const unsigned char ascii_to_ebcdic [256] =
    {
     0  , 1  , 2  , 3  , 55 , 45 , 46 , 47 , 22 , 5  , 10 , 11 , 12 , 13 , 14 , 15 ,
     16 , 17 , 18 , 19 , 60 , 61 , 50 , 38 , 24 , 25 , 63 , 39 , 28 , 29 , 30 , 31 ,
     64 , 79 , 127, 123, 91 , 108, 80 , 125, 77 , 93 , 92 , 78 , 107, 96 , 75 , 97 ,
     240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 122, 94 , 76 , 126, 110, 111,
     124, 193, 194, 195, 196, 197, 198, 199, 200, 201, 209, 210, 211, 212, 213, 214,
     215, 216, 217, 226, 227, 228, 229, 230, 231, 232, 233, 74 , 224, 90 , 95 , 109,
     121, 129, 130, 131, 132, 133, 134, 135, 136, 137, 145, 146, 147, 148, 149, 150,
     151, 152, 153, 162, 163, 164, 165, 166, 167, 168, 169, 192, 106, 208, 161, 7  ,
     32 , 33 , 34 , 35 , 36 , 21 , 6  , 23 , 40 , 41 , 42 , 43 , 44 , 9  , 10 , 27 ,
     48 , 49 , 26 , 51 , 52 , 53 , 54 , 8  , 56 , 57 , 58 , 59 , 4  , 20 , 62 , 225,
     65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 81 , 82 , 83 , 84 , 85 , 86 , 87 ,
     88 , 89 , 98 , 99 , 100, 101, 102, 103, 104, 105, 112, 113, 114, 115, 116, 117,
     118, 119, 120, 128, 138, 139, 140, 141, 142, 143, 144, 154, 155, 156, 157, 158,
     159, 160, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,
     184, 185, 186, 187, 188, 189, 190, 191, 202, 203, 204, 205, 206, 207, 218, 219,
     220, 221, 222, 223, 234, 235, 236, 237, 238, 239, 250, 251, 252, 253, 254, 255
    };
     
    extern const unsigned char ebcdic_to_ascii [256] =
    {
     0  , 1  , 2  , 3  , 156, 9  , 134, 127, 151, 141, 10, 11 , 12 , 13 , 14 , 15 ,
     16 , 17 , 18 , 19 , 157, 133, 8  , 135, 24 , 25 , 146, 143, 28 , 29 , 30 , 31 ,
     128, 129, 130, 131, 132, 10 , 23 , 27 , 136, 137, 138, 139, 140, 5  , 6  , 7  ,
     144, 145, 22 , 147, 148, 149, 150, 4  , 152, 153, 154, 155, 20 , 21 , 158, 26 ,
     32 , 160, 161, 162, 163, 164, 165, 166, 167, 168, 91 , 46 , 60 , 40 , 43 , 33 ,
     38 , 169, 170, 171, 172, 173, 174, 175, 176, 177, 93 , 36 , 42 , 41 , 59 , 94 ,
     45 , 47 , 178, 179, 180, 181, 182, 183, 184, 185, 124, 44 , 37 , 95 , 62 , 63 ,
     186, 187, 188, 189, 190, 191, 192, 193, 194, 96 , 58 , 35 , 64 , 39 , 61 , 34 ,
     195, 97 , 98 , 99 , 100, 101, 102, 103, 104, 105, 196, 197, 198, 199, 200, 201,
     202, 106, 107, 108, 109, 110, 111, 112, 113, 114, 203, 204, 205, 206, 207, 208,
     209, 126, 115, 116, 117, 118, 119, 120, 121, 122, 210, 211, 212, 213, 214, 215,
     216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231,
     123, 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 232, 233, 234, 235, 236, 237,
     125, 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 238, 239, 240, 241, 242, 243,
     92 , 159, 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 244, 245, 246, 247, 248, 249,
     48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 250, 251, 252, 253, 254, 255
     
    };
    et un exemple d'utilisation de ces tables (2 fonctions de conversion ASCII->EBCDIC/EBCDIC->ASCII

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    //---------------------------------------------------------------------------
    // convertit un ficher texte ASCII en EBCDIC
    void __fastcall ConvertASCIIToEBCDIC(String ASCIISource,String EBCDICDest)
    {
       if(!FileExists(ASCIISource)) return;
     
       TFileStream * FileSource = new TFileStream(ASCIISource,fmOpenRead);
       TFileStream * FileDest = new TFileStream(EBCDICDest,fmCreate	);
       int buffer_size = 255;              // arbitraire
       int taille_source = FileSource->Size;
       if(taille_source<buffer_size){
              buffer_size =  taille_source;
              char * buffer = new char[buffer_size];
              FileSource->Read(buffer,buffer_size);
              for(int i=0;i<buffer_size;i++){
                 buffer[i]= ascii_to_ebcdic[buffer[i]];
              }
              FileDest->Write(buffer,taille_source);
       }else{
           int nb_be = taille_source / buffer_size; //nombre de boucle contenant de 255
           int nbc_restants =  taille_source % buffer_size; //nombre de caractères restants à la fin
           for(int i=0;i<nb_be;i++){
              char * buffer = new char[buffer_size];
              FileSource->Read(buffer,buffer_size);
              for(int i=0;i<buffer_size;i++){
                    buffer[i]= ascii_to_ebcdic[buffer[i]];
              }
              FileDest->Write(buffer,buffer_size);
              delete buffer;
           }
           if(nbc_restants!=0){
              char * buffer = new char[nbc_restants];
              FileSource->Read(buffer,nbc_restants);
              for(int i=0;i<nbc_restants;i++){
                 buffer[i]= ascii_to_ebcdic[buffer[i]];
              }
              FileDest->Write(buffer,nbc_restants);
              delete buffer;
           }
       }
       delete  FileSource;
       delete  FileDest;
    }
    //------------------------------------------------------------------------
    // convertit un ficher texte  EBCDIC en ASCII 
     
    void __fastcall ConvertEBCDICtoASCII(String EBCDISource,String ASCIIDest)
    {
       if(!FileExists(EBCDISource)) return;
     
       TFileStream * FileSource = new TFileStream(EBCDISource,fmOpenRead);
       TFileStream * FileDest = new TFileStream(ASCIIDest,fmCreate	);
       int buffer_size = 255;
       int taille_source = FileSource->Size;
       if(taille_source<buffer_size){
              buffer_size =  taille_source;
              char * buffer = new char[buffer_size];
              FileSource->Read(buffer,buffer_size);
              for(int i=0;i<buffer_size;i++){
                //unsigned pour obtenir un entier>0 pour les caractères dont la valeur>127
                 unsigned char c = buffer[i];
                 unsigned char c2 = ebcdic_to_ascii[(int)c];
                 buffer[i]= c2;
              }
              FileDest->Write(buffer,buffer_size);
              delete buffer;
       }else{
           int nb_be = taille_source / buffer_size; //nombre de boucle contenant
           int nbc_restants =  taille_source % buffer_size;
           for(int i=0;i<nb_be;i++){
              char * buffer = new char[buffer_size];
              FileSource->Read(buffer,buffer_size);
              for(int i=0;i<buffer_size;i++){
                 unsigned char c = buffer[i];
                 unsigned char c2 = ebcdic_to_ascii[(int)c];
                 buffer[i]=c2;
              }
              FileDest->Write(buffer,buffer_size);
              delete buffer;
           }
           if(nbc_restants!=0){
              char * buffer = new char[nbc_restants];
              FileSource->Read(buffer,nbc_restants);
              for(int i=0;i<nbc_restants;i++){
                 unsigned char c = buffer[i];
                 unsigned char c2 =ebcdic_to_ascii[(int)c];
                 buffer[i]= c2;
              }
              FileDest->Write(buffer,nbc_restants);
              delete buffer;
           }
       }
       delete  FileSource;
       delete  FileDest;
    }
    //------------------------------------------------------------------------
    voilà , si ça peut t'aider....

Discussions similaires

  1. Conversion Ascii vers Hexa
    Par Alckolo dans le forum C#
    Réponses: 4
    Dernier message: 14/11/2011, 12h20
  2. Conversion ASCII vers Hexa
    Par PtiBruno dans le forum C
    Réponses: 3
    Dernier message: 25/02/2008, 09h40
  3. [Conversion] Décimal vers caractère (Ascii)
    Par Hokage dans le forum Débuter
    Réponses: 2
    Dernier message: 01/10/2007, 11h39
  4. conversion UTF8 vers ASCII en C
    Par znarf dans le forum C
    Réponses: 2
    Dernier message: 05/07/2006, 13h55
  5. Conversion texte Ascii vers Image ou Pdf
    Par davydreyAXESS dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2006, 15h45

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