L'impression que les valeurs hexadécimales d'un char* tableau en C donne des valeurs bizarres pour l'entrée binaire
Voici un étrange problème qui a été estompe moi pour un peu.
Le programme est écrit en C89, et il lit un fichier dans un char* tableau 16 octets à la fois (à l'aide de fread et d'une taille sizeof(char)). Le fichier est fopen serait avec le "rb" drapeaux. Le tableau est ensuite passé dans une fonction qui prend essentiellement en la 16 les valeurs hexadécimales et se l'enfonce dans une chaîne, chaque valeur séparés par un espace.
Voici où l'étrangeté. La fonction produit une belle vidage hexadécimal, 16 octets à la fois, pour un fichier texte d'entrée que j'ai. Mais il vis, si je l'ai essayer sur une petite image bitmap (j'arrive à la fin avec la sortie de la chaîne comme ffffff88 au lieu de seulement 88.
Les valeurs hexadécimales sont placés dans la chaîne de sortie en utilisant sprintf("%02x ", input[i]); dans une boucle.
Pourquoi serait-ce un travail correctement pour certains fichiers, mais pas les autres?
OriginalL'auteur Kozaki | 2009-11-20
Vous devez vous connecter pour publier un commentaire.
Ce que vous voyez est le résultat de l'extension du signe de la
char
àint
, à l'aide deunsigned char *
ou de la conversion enunsigned char
avant le cast vers le type int est (implicitement?) réalisée devrait résoudre votre problème.OriginalL'auteur rsp
Dans C le char est traitée comme une valeur signée, sauf si vous spécifiez comme non signés. Il semble que lorsque vous passer des paramètres à une fonction, que lorsque le paramètre se trouve être un char, c'est le collier à la taille d'un régulier entier. Si vous n'avez pas la moindre idée de le compilateur de ce qui devrait être fait dans un unsigned façon, 128 devient 0xFFFFFF80, et ainsi de suite.
Ainsi, l'extension du signe qui se passe avant l'impression formateur se fait jamais à regarder la valeur. Ce que cela signifie, c'est que
ne résolvent pas votre problème, la valeur de l'entrée[i] sera signe étendu, de sorte que toutes les valeurs de 128 à 255 sont traités comme de -127 à -1 et devenir 0xFFFFFF80 à 0xFFFFFF, puis jeté, alors que
fera l'affaire, mais est une sorte de déhanchée et difficile à lire. Mieux pour rendre le type d'entrée[] être unsigned char en premier lieu.
OriginalL'auteur JustJeff