C - L' %x spécificateur de format
J'ai une petite question. Je sais que le %x spécificateur de format peut être utilisé pour lire des valeurs de la pile dans une chaîne de format d'attaque.
J'ai trouvé le code suivant:
%08x%08x%08x%08x
Quoi le 08 signifie? C'est quoi exactement? Merci 🙂
- Largeur de champ de 8 caractères, plus courte chiffres précédé de zéros pour correspondre à la largeur de champ, par exemple
000007ac
ou0005ceef
. - La fonction de ce parler? Vous dites que "lire des valeurs", mais toutes les réponses semblent assumer
printf()
est utilisé. - bon point. nous avons tous écrit pour printf.
- Je suis bête. Oui, je faisais allusion à l'utilisation de ce code au sein de la fonction printf.
Vous devez vous connecter pour publier un commentaire.
Décomposée en:
8
dit que vous voulez montrer à 8 chiffres0
que vous souhaitez préfixe0
's au lieu de simplement les espaces videsx
que vous souhaitez imprimer dans le bas-de-casse hexadécimal.Exemple rapide (grâce à Grijesh Chauhan):
De sortie:
Voir aussi http://www.cplusplus.com/reference/cstdio/printf/ de référence.
%-8x
et le capitalX
. et observer l'effet8
et0
sont tous deux des nombres (et donc les pièces identiques d'une grammaire de la langue anglaise), ils sont de différentes parties du format de printf grammaire.0
est un "drapeau" et8
est un paramètre "width" (qui peut être<ε (no input)>
,<d (any number greater than 0)>
, ou* (a literal asterisk)
). C'est un non-intuitive API pour sûr! Mais que pouvez-vous dire... c'est tous les anciens de style C des choses, où la mémoire était une prime que vous voulez enregistrer autant de caractères dans un programme que possible - je suis d'accord avec leur décision, compte tenu des contraintes qu'ils face à!printf
syntaxe? J'aime l'utiliser%
que le caractère d'échappement, il est si unique et niche à la mise en forme de chaîne. Je pense que les modificateurs doit être ajouté plutôt que de l'avant, cependant, de cette façon, vous pouvez le lire de gauche à droite. Quelque chose comme%<specifier>[%f<flags>][%-w<width>.<precision>]%
, au lieu de%[flags][width][.precision][length]specifier
. J'ai choisi un%
entre chaque domaine, ainsi que de l'un à proximité (vous pouvez toujours faire%x%x
- `%%x%x%) et permet une multi-char spécificateurQui spécifie le nombre de chiffres que vous voulez montrer.
%08x
signifie que chaque numéro doit être affiché au moins 8 caractères, avec le remplissage de tous les pas de chiffres avec des zéros, par exemple pour '1' sortie sera00000001
De http://en.wikipedia.org/wiki/Printf_format_string
utilisation 0 à la place des espaces pour remplir un champ lorsque la largeur option est spécifiée. Par exemple,
printf("%2d", 3)
résultats en "3", alors queprintf("%02d", 3)
résultats dans "03".La chaîne de format attaque printf vous avez mentionné n'est pas spécifique à l' "%x" mise en forme - dans tous les cas où printf a plus de paramètres de mise en forme que transmis variables, il va lire les valeurs de la pile qui ne lui appartiennent pas. Vous obtiendrez le même problème avec %d par exemple.
%x est utile lorsque vous voulez voir ces valeurs hex.
Comme expliqué dans les réponses précédentes, %08x va produire un nombre hexadécimal à 8 chiffres, collier par précédé de zéros.
À l'aide de la mise en forme de votre exemple de code de printf, avec pas de paramètres supplémentaires:
Ira chercher les 4 paramètres de la pile et de les afficher sous forme de 8 chiffres collier de nombres hexadécimaux.