printf : impression précise des valeurs hexadécimales
Lorsque vous travaillez avec des vecteurs de caractères, il est courant de rencontrer un écart lors de l'impression d'octets individuels en hexadécimal formater en utilisant printf. Ce problème survient lorsque vous tentez d'imprimer un seul caractère, qui ne fait qu'un seul octet, mais que vous obtenez à la place une valeur multi-octets.
La raison derrière ce comportement réside dans la correspondance de type de printf. Le modificateur %x attend un paramètre int non signé, et un caractère est généralement promu en int lorsqu'il est transmis à une fonction d'argument variable. Cette promotion peut conduire à des résultats incorrects lors de l'impression de valeurs de caractère unique.
Pour résoudre ce problème, il faut explicitement convertir le caractère en un entier non signé pour garantir des résultats prévisibles. Par exemple, le code suivant imprimera avec précision un seul octet :
printf(" 0x%1x ", (unsigned)pixel_data[0]);
Il est important de noter qu'une largeur de champ de un n'est pas particulièrement utile dans ce contexte, car elle spécifie simplement le nombre minimum de chiffres à afficher. Cependant, si vous souhaitez traiter les valeurs d'octet comme des valeurs non signées et les étendre à zéro lors de la conversion en entier non signé, vous pouvez utiliser un caractère non signé pour le vecteur ou effectuer une conversion spécifique :
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0]);
Alternativement, vous pouvez appliquer une opération de masquage après promotion pour obtenir le même résultat :
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU);
En suivant ces techniques, vous pouvez vous assurer que printf imprime avec précision valeurs hexadécimales, même lorsqu'il s'agit d'octets uniques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!