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

Transformation chaine de caractère en hexadécimal


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 141
    Points : 92
    Points
    92
    Par défaut Transformation chaine de caractère en hexadécimal
    Bonjour à tous,

    j'ai récupérer une class sur le net.
    Dans cette classe j'ai une fonction qui récupère comme argument une valeur héxadécimale (une couleur) du type 0x1255FF
    or de mon côté j'aimerai passer une couleur aléatoire, j'ai donc trouver cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function randomColor()
    	{
    		$l = array('1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F');
    		$color = "";
    		for($i = 0; $i<6; $i++)
    		{
    			$color	.=	$l[rand(0,15)];
    		}
     
    		return "0x".$color;
    	}
    le problème c'est que ma couleur n'est pas "une couleur" mais une chaine de caractère et la fonction d'origine n'en veut pas

    avez une idée pour régler mon problème ?

    Merci d'avance

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Comment ça elle n'en veut pas ?? Il me semble bien que tu génères une chaîne de caractères ressemblant fort à a l'héxa.... As tu essayé en faisant un cast pour obtenir un nombre ??


    Cordialement,
    Patouche

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Il serait intéressant d'avoir le code de cette fonction pour comprendre pourquoi elle n'accepte pas la chaine hexa que tu lui passes.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 141
    Points : 92
    Points
    92
    Par défaut
    je pense avoir essayé un peu tout ce que je connais !
    en faite je lui passe comme paramètre "0x112233" au lieu de 0x112233
    la classe qui génère les graphiques utilise bien la 2e syntaxe et ne veux pas de la première.
    Alors j'ai bien trouvé des fonctions pour convertir en héxa mais c'est pour du binaire/héxa ou décimal/héxa ... mais rien pour les chaines

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Et si tu fais un cast pour avoir un int, est ce que ça marche ?? Ce que semble vouloir ta fonction, n'est un nombre de type int. Après, c'est pas faux que voir la dites fonction pourrait aider.

    Patouche

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 141
    Points : 92
    Points
    92
    Par défaut
    non ça ne fonctionne pas en transformant en int
    voici la fonction
    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
    function camembert($arr)
    	{	
    	   $size=3;                  /* taille de la police, largeur du caractère */
    	   $ifw=imagefontwidth($size);							
     
    	   $w=500;                   /* largeur de l'image */
    	   $h=250;                   /* hauteur de l'image */
    	   $a=120;                   /* grand axe du camembert */
    	   $b=$a/2;                  /* 60 : petit axe du camembert */
    	   $d=$a/2;                  /* 60 : "épaisseur" du camembert */
    	   $cx=$w/2-1;               /* abscisse du "centre" du camembert */
    	   $cy=($h-$d)/2;            /* 95 : ordonnée du "centre" du camembert */
     
    	   $A=138;                   /* grand axe de l'ellipse "englobante" */
    	   $B=102;                   /* petit axe de l'ellipse "englobante" */
    	   $oy=-$d/2;                /* -30 : du "centre" du camembert à celui de l'ellipse "englobante"*/
     
    	   $img=imagecreate($w,$h);  
    	   $bgcolor=imagecolorallocate($img,0xCD,0xCD,0xCD);	
    	   imagecolortransparent($img,$bgcolor); 
    	   $black=imagecolorallocate($img,0,0,0);
    	                             /* calcule la somme des données */
    	   for ($i=$sum=0,$n=count($arr);$i<$n;$i++) $sum+=$arr[$i][0];	
     
    	   /* fin des préliminaires : on peut vraiment commencer! */
    	   for ($i=$v[0]=0,$x[0]=$cx+$a,$y[0]=$cy,$doit=true;$i<$n;$i++) {														
    	      for ($j=0,$k=16;$j<3;$j++,$k-=8) $t[$j]=($arr[$i][1]>>$k) & 0xFF;
    	                             /* détermine les "vraies" couleurs */
    	      $color[$i]=imagecolorallocate($img,$t[0],$t[1],$t[2]);
    	                             /* calcule l'angle des différents "secteurs" */
    	      $v[$i+1]=$v[$i]+round($arr[$i][0]*360/$sum);	
     
    	      if ($doit) {           /* détermine les couleurs "ombrées" */
    	         $shade[$i]=imagecolorallocate($img,max(0,$t[0]-50),max(0,$t[1]-50),max(0,$t[2]-50)); 
     
    	         if ($v[$i+1]<180) { /* calcule les coordonnées des différents parallélogrammes */
    	            $x[$i+1]=$cx+$a*cos($v[$i+1]*M_PI/180);		
    	            $y[$i+1]=$cy+$b*sin($v[$i+1]*M_PI/180);	
    	         }										
    	         else {
    	            $m=$i+1;
    	            $x[$m]=$cx-$a;   /* c'est comme si on remplaçait $v[$i+1] par 180° */
    	            $y[$m]=$cy;	
    	            $doit=false;     /* indique qu'il est inutile de continuer! */
    	         }
    	      }
    	   }
     
    	   /* dessine la "base" du camembert */
    	   for ($i=0;$i<$m;$i++) imagefilledarc($img,$cx,$cy+$d,2*$a,2*$b,$v[$i],$v[$i+1],$shade[$i],IMG_ARC_PIE);
     
    	   /* dessine la partie "verticale" du camembert */														
    	   for ($i=0;$i<$m;$i++) {						
    	      $area=array($x[$i],$y[$i]+$d,$x[$i],$y[$i],$x[$i+1],$y[$i+1],$x[$i+1],$y[$i+1]+$d);
    	      imagefilledpolygon($img,$area,4,$shade[$i]);			
    	   }
     
    	   /* dessine le dessus du camembert */
    	   for ($i=0;$i<$n;$i++) imagefilledarc($img,$cx,$cy,2*$a,2*$b,$v[$i],$v[$i+1],$color[$i],IMG_ARC_PIE);
     
    	   /*imageellipse($img,$cx,$cy-$oy,2*$A,2*$B,$black);	// dessine l'ellipse "englobante" */
     
    	   /* dessine les "flêches" et met en place le texte */
    	   for ($i=0,$AA=$A*$A,$BB=$B*$B;$i<$n;$i++) if ($arr[$i][0]) {
    	      $phi=($v[$i+1]+$v[$i])/2;       
    	                             /* intersection des "flêches" avec l'ellipse "englobante" */
    	      $px=$a*3*cos($phi*M_PI/180)/4;		
    	      $py=$b*3*sin($phi*M_PI/180)/4;		
    	                             /* équation du 2ème degré avec 2 racines réelles et distinctes */	
    	      $U=$AA*$py*$py+$BB*$px*$px;         
    	      $V=$AA*$oy*$px*$py;						
    	      $W=$AA*$px*$px*($oy*$oy-$BB);	
    	                             /* calcule le pourcentage à afficher */
    	      $value=number_format(100*$arr[$i][0]/$sum,2,",","")."%";
    	                             /* écrit le texte à droite */	
    	      if ($phi<90 || $phi>270) {          
    	         $root=(-$V+sqrt($V*$V-$U*$W))/$U;
    	         imageline($img,$px+$cx,$py+$cy,$qx=$root+$cx,$qy=$root*$py/$px+$cy,$black);
    	         imageline($img,$qx,$qy,$qx+10,$qy,$black);		
     
    	         imagestring($img,$size,$qx+14,$qy-12,$arr[$i][2],$black);
    	         imagestring($img,$size,$qx+14,$qy-2,$value,$black);
    	      }
    	      else {                 /* écrit le texte à gauche */
    	         $root=(-$V-sqrt($V*$V-$U*$W))/$U;
    	         imageline($img,$px+$cx,$py+$cy,$qx=$root+$cx,$qy=$root*$py/$px+$cy,$black);
    	         imageline($img,$qx,$qy,$qx-10,$qy,$black);		
     
    	         imagestring($img,$size,$qx-12-$ifw*strlen($arr[$i][2]),$qy-12,$arr[$i][2],$black);
    	         imagestring($img,$size,$qx-12-$ifw*strlen($value),$qy-2,$value,$black);
    	      }
    	   }
     
    	   header("Content-type: image/png");
    	   imagepng($img);
    	   imagedestroy($img);
    	}
    la valeur contenant l'héxa est l'élément "1" du tableau ($arr[$i][1])

    je continue de chercher de mon côté, merci de votre aide

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Une valeur hexa n'est qu'un entier représenté d'une manière différente au niveau du code.
    Écrire $var = 0xFF ou $var = 255, c'est exactement la même chose.

    Il faut donc passer un entier à ta fonction.

    pour une couleur 24 bits aléatoire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $couleur = mt_rand( 1 , pow( 2 , 24 ) ) - 1;
    Sinon pour retransformer une chaîne hexa comme tu la génères, il faut utiliser la fonction hexdec( $chaine ) ; Un simple cast ne fonctionne pas.

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Ta fonction n'attend pas du tout une couleur mais un tableau de données. Enfin, c'est comme ça que je le vois. Tu calcules d'abord la somme des échantillons et tu mets ça dans sum et ensuite tu partages tes différents échantillons sur le camembert.

    Sinon, à quoi correspondrait le $sum et le $arr dans
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    round($arr[$i][0]*360/$sum);
    qui sert à déterminer l'angle. et à quoi servirait le $sum (qui ne pourrait fonctionner si tu lui passe un int ou une string.

    Renseignes toi sur ta fonction avant tout autre chose.

    Patouche

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 141
    Points : 92
    Points
    92
    Par défaut
    oui je sais que ma fonction prend comme paramètre un tableau, mais j'ai simplifié mon explication ...

    mon soucis reste toujours le même
    j'ai essayé de faire passer un nombre en décimal et rien à faire
    idem après conversion en héxa ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function randomColor()
    	{
    		$color	=	dechex(str_pad(rand(0, 255*255*255), 6, 0, STR_PAD_LEFT));
     
    		return $color;
    	}
    maintenant je retourne quelque chose sous la forme AB327E (par exemple)
    ce qui pose problème c'est vraiment sur cette ligne dans la fonction "camembert"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ($j=0,$k=16;$j<3;$j++,$k-=8)
       $t[$j]	=	($arr[$i][1] >> $k) & 0xFF;
    $arr[$i][1] est le code couleur, donc mon AB327E ne marche pas
    il ne veut que 0xAB327E et surtout pas "0xAB327E"

    tout ça pour une couleur !!!! que de remue-méninges

  10. #10
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Exact, tu as raison..

    essaie de faire un cast pour arriver sur un int.

    Donc pour ta fonction randomColor(), tu prend la première version et tu rajoutes jute:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function randomColor()
    	{
    		$l = array('1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F');
    		$color = "";
    		for($i = 0; $i<6; $i++)
    		{
    			$color	.=	$l[rand(0,15)];
    		}
     
    		$color = "0x".$color;
    		return (int) $color;
    	}

    Normalement, ça devrait te transformer ta chaine hexa en un int. Un nombre garde la même valeur, peu importe qu'il soit écrit en héxa, en binaire ou en base 7 si ça te fait plaisir.

    J'en reviens donc au cast qui te transforme une string en int.


    Patouche

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 141
    Points : 92
    Points
    92
    Par défaut
    Merci pour votre aide

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

Discussions similaires

  1. chaine de caractères avec hexadécimal
    Par roland34 dans le forum Général Python
    Réponses: 5
    Dernier message: 07/08/2013, 16h37
  2. [Debutant] Transformation chaine de caractères
    Par olivier1209 dans le forum Langage
    Réponses: 8
    Dernier message: 21/03/2010, 21h34
  3. transformation chaine de caractères en objet
    Par yrandco49 dans le forum Langage
    Réponses: 3
    Dernier message: 26/06/2009, 16h51
  4. Réponses: 2
    Dernier message: 14/01/2005, 15h40
  5. Fonction qui transforme chaine de caractère par une autre?
    Par geoffreykill dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 09/12/2004, 14h31

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