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++ Discussion :

Valeur étrange pour ','


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 12
    Par défaut Valeur étrange pour ','
    Bonjour,

    J'ai un problème que je ne serne pas du tout. Je suis en train de réaliser le portage d'une veille application en c++ vers du C#.

    dans cette application, un algorithme de compression est implémenté. Le voici

    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    int compress(char *Origin, char *Desti, int act) 
    {
    unsigned char c, cc;
    int k, j, nb, i, m, err=0 ;
    FILE *fx, *fz;
     
    	fx = fopen (Origin, "r+b");      
    	fz = fopen (Desti , "w+b");   
     
    	switch(act)
    	{
    		case 2 :   /* Teste si le fichier est compressé */
    		{
    		unsigned char buf_O[BUFF_COMPR] ;
     
    			nb = fread(buf_O,1,6,fx) ;  /* recherche de la signature */
    			if ( nb < 6 )
    			{
    				err = 10 ;
    			        break ;
    			}
     
    			//if ( strncmp(buf_O, "UDTQCS", 6) != 0 ) err = 1 ; /*  non compressé */
    		        //else err = 2; /*  compressé     */
    		        break ;
    		}   
    		case 1 :   /* Compression */
    		{
    		unsigned char buf_O[BUFF_COMPR], buf_D[BUFF_COMPR] ;
     
    			nb = fread(buf_O,1,6,fx) ;  /* recherche de la signature */
    			if ( nb < 6 )
    			{
    				err = 10 ;
    				break ;
    			}
     
    			/*if ( strncmp(buf_O, "UDTQCS", 6) == 0 )
    			{
    				err = 2 ;                //  le fichier est déjà compressé
    				break ;
    		        }*/
     
    		        fseek (fx, 0L, SEEK_SET);
     
    			//strcpy(buf_D, "UDTQCS");  /* mise en place de la signature */
    			fwrite(buf_D,6,1,fz);
     
    			while( 1 )
    			{
    				nb = fread(buf_O,1,BUFF_COMPR,fx) ;
    				if ( nb == 0 ) break ;
    				j = i = 0 ;
     
    				c = buf_O[i++] ;
    				buf_D[j++] = c ;
    			        k = 1 ;
     
    				while ( i < nb )
    				{
    					cc = buf_O[i++] ;
    					if ( c != cc )
    					{
    						if ( k != 1 )
    					    	{
    					                buf_D[j++] = (unsigned char)(k | 0x80); 
    							k = 1 ;
    				                }
    			               		c = cc ;
    				                if ( c & 0x80 )buf_D[j++] = 0x1B ; 
    					        buf_D[j++] = c ; 
    			               	}
    	        			else
    					{
    						k++ ;
    				                if ( k > 125 )
    						{
    							k-- ;
    							buf_D[j++] = (unsigned char)(k | 0x80); 
    							k = 1 ;
    							if ( c & 0x80 )buf_D[j++] = 0x1B ; 
    					                buf_D[j++] = c ; 
    				                }
    					}
    				}
    				if ( k > 1 ) buf_D[j++] = (unsigned char)(k | 0x80);
    			        fwrite(buf_D,j,1,fz) ;
    			}
    			break ;
    		}   
    		case 0 :   /* Décompression */
    		{
    		unsigned char buf_O[BUFF_COMPR], buf_D[BUFF_COMPR] ;
     
    			nb = fread(buf_O,1,6,fx) ;  /* recherche de la signature */
    			if ( nb < 6 )
    			{
    				err = 10 ;
    		        	break ;
    			}
     
            		/*if ( strncmp(buf_O, "UDTQCS", 6) != 0 )
    		        {
    				err = 1 ;                //  le fichier n'est pas compressé //
    			        break ;
    		        }*/
     
    		        j = 0 ;
    		        cc = '\0' ;
     
    		        while( 1 )
    			{
    				nb = fread(buf_O,1,BUFF_COMPR,fx) ;
    				if ( nb == 0 ) break ;
    				i = 0 ;
     
    			        while ( i < nb )
    				{
    					c = buf_O[i++] ;
    					if ( (c & 0x80) && cc != 0x1B ) 
    					{
    						k = (int)(c & 0x7F ) - 1 ;
    			        		for ( m = 0 ; m < k ; m++ )
    						{
    							buf_D[j++] = cc ; 
    							if ( j == BUFF_COMPR )
    							{
    								fwrite(buf_D,j,1,fz) ;
    						                j = 0 ;
    	                     				}
    						}
    					}
    					else
    					{
    						if ( c != 0x1B ) 
    	        				{
    							buf_D[j++] = c ; 
    							if ( j == BUFF_COMPR )
    							{
    					                        fwrite(buf_D,j,1,fz) ;
    				                        	j = 0 ;
    							}
    						}
    						cc = c ;
    		        		}
    				}
    			}
    			if ( j > 0 ) fwrite(buf_D,j,1,fz) ;
    			break ;
    		}   
    	}
    	fclose(fx) ;
    	fclose(fz) ;
    	return (err);
    }
    Ne vous souciez pas trop des partie en commentaire, elle ne sont la que pour vérifier si le fichier est compréssé ou non. Et la n'est pas mon problème.

    Je me suis focalisé sur la décompression, car g déjà un fichier compresser par cet algo.

    Concentrons-nous alors sur la partie 0 du switch
    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
    case 0 :   /* Décompression */
    		{
    		unsigned char buf_O[BUFF_COMPR], buf_D[BUFF_COMPR] ;
     
    			nb = fread(buf_O,1,6,fx) ;  /* recherche de la signature */
    			if ( nb < 6 )
    			{
    				err = 10 ;
    		        	break ;
    			}
     
            		/*if ( strncmp(buf_O, "UDTQCS", 6) != 0 )
    		        {
    				err = 1 ;                //  le fichier n'est pas compressé //
    			        break ;
    		        }*/
     
    		        j = 0 ;
    		        cc = '\0' ;
     
    		        while( 1 )
    			{
    				nb = fread(buf_O,1,BUFF_COMPR,fx) ;
    				if ( nb == 0 ) break ;
    				i = 0 ;
     
    			        while ( i < nb )
    				{
    					c = buf_O[i++] ;
    					if ( (c & 0x80) && cc != 0x1B ) 
    					{
    						k = (int)(c & 0x7F ) - 1 ;
    			        		for ( m = 0 ; m < k ; m++ )
    						{
    							buf_D[j++] = cc ; 
    							if ( j == BUFF_COMPR )
    							{
    								fwrite(buf_D,j,1,fz) ;
    						                j = 0 ;
    	                     				}
    						}
    					}
    					else
    					{
    						if ( c != 0x1B ) 
    	        				{
    							buf_D[j++] = c ; 
    							if ( j == BUFF_COMPR )
    							{
    					                        fwrite(buf_D,j,1,fz) ;
    				                        	j = 0 ;
    							}
    						}
    						cc = c ;
    		        		}
    				}
    			}
    			if ( j > 0 ) fwrite(buf_D,j,1,fz) ;
    			break ;
    		}
    et voici une ligne du fichier compressé (il ne faut pas tenir compte des cotes en début et fin de chaine):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '07262812010OT‚I060120‚906429380ˆ130 ˆ0… ý ý ý Ñ ý ý à'
    Mon problème vient de cette ligne :
    Au début du case, lorsque l'algo lit le caractère ',' sa valeur en entier vaut 130, ce qui lui permet, une fois le masque appliquer de passer dans le test juste en dessous et de recopier une nouvelle fois le caractère précédent.

    Le souci c'est que -à moins qu'il en existe plusieurs- la table ascii dit que la virgule à pour code ascii 44 et non pas 130.

    Du coup dans mon impléentation en C#, la virgule ne passe pas le test et est inscrite dans mon fichier décompressé au lieu de répéter le caractère précèdent.

    Pouvez-vous m'aider ?

    PS : j'oubliais voici la ligne du fichier mais en version décompressé (pareil, il ne faut pas tenir compte des cotes en début et fin de chaine)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '072628122010OTTI060120090642938000000001130        00000                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  '

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Que te dit ton éditeur hexa préféré ?

    Je penche pour un caractère UTF8 : un non caractère (>= 0x80, < 0xC0), et le débugger affiche un peu ce qu'il veux. Mais je me trompe peut-être, car vu qu'UTF8 n'admets pas ces caractères, le debugger pourrait tout aussi comprendre qu'il ne s'agit pas d'une chaine UTF8.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 12
    Par défaut
    Tu as bien raison, ce n'est pas une vrai ',' il s'agit en fait de la valeur 0x82.

    Mon problème vient alors de l'interprétation du C#. Je pense que je doit donc changer de forum

    Je te remercie pour cette réponse très rapide.

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

Discussions similaires

  1. [Tableaux] Tableau valeur vide pour une clé
    Par hisy dans le forum Langage
    Réponses: 3
    Dernier message: 17/01/2006, 11h49
  2. Erreur : Valeur incorrecte pour ce champ
    Par Invité dans le forum Access
    Réponses: 5
    Dernier message: 04/01/2006, 12h09
  3. Valeur mini pour un Champs avec un bouton + et un - a coté
    Par budiste dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 01/12/2005, 14h09
  4. Aucune valeur donnée pour ...
    Par Gathe dans le forum ASP
    Réponses: 15
    Dernier message: 06/12/2004, 17h24
  5. Réponses: 9
    Dernier message: 10/08/2004, 17h13

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