Programmation en C : comment puis-je lire et d'imprimer un octet dans un fichier binaire?
Je veux ouvrir un fichier binaire, à lire le premier octet du fichier et enfin d'imprimer la valeur hexadécimale (dans un format de chaîne) sur la sortie standard (ie, si le premier octet est 03 hex, je souhaite imprimer 0x03 par exemple). La sortie j'obtiens ne correspond pas avec ce que je sais être dans mon exemple binaire, alors je me demande si quelqu'un peut aider avec ceci.
Voici le code:
#include <stdio.h>
#include <fcntl.h>
int main(int argc, char* argv[])
{
int fd;
char raw_buf[1],str_buf[1];
fd = open(argv[1],O_RDONLY|O_BINARY);
/* Position at beginning */
lseek(fd,0,SEEK_SET);
/* Read one byte */
read(fd,raw_buf,1);
/* Convert to string format */
sprintf(str_buf,"0x%x",raw_buf);
printf("str_buf= <%s>\n",str_buf);
close (fd);
return 0;
}
Le programme est compilé comme suit:
gcc rd_byte.c -o rd_byte
et exécuter comme suit:
rd_byte BINFILE.bin
Sachant que l'exemple de fichier binaire utilisé a 03 de son premier octet, je reçois la sortie:
str_buf= <0x22cce3>
Ce que j'attends est
str_buf= <0x03>
Où est l'erreur dans mon code?
Merci pour toute aide.
OriginalL'auteur Esquif | 2010-01-08
Vous devez vous connecter pour publier un commentaire.
Moins, c'est plus...
seek
ing n'est pas nécessaireunsigned char
printf
fera le formatOriginalL'auteur Diego Torres Milano
De l'impression de la valeur du pointeur
raw_buf
, pas la mémoire à cet emplacement:Andreas dit,
str_buf
est pas assez grand. Mais: pas besoin d'un deuxième tampon, vous pouvez simplement appelerprintf
directement.OriginalL'auteur Nick Meyer
Je pense que vous êtes de compliquer à l'excès et consommer des non-portable constructions où ils ne sont pas vraiment nécessaires.
Vous devriez être en mesure de faire:
OriginalL'auteur CB Bailey
str_buf
a une taille maximale de 1 (char str_buf[1];
), il devrait au moins 5 octets de long (4 pour XxXX, plus le \0).En outre, le changement
à
sinon vous allez imprimer l'adresse de la
raw_buf
aiguille, au lieu de sa valeur (que l'on peut obtenir par déréférencement le pointeur).Enfin, assurez-vous que les deux raw_buf est
unsigned
. La norme définie que l'signness de caractères (si ce n'est explicitement spécifié) est définie par l'implémentation, c'est à dire, chaque réalisation décide si elles doivent être signés ou non. Dans la pratique, sur la plupart des implémentations ils sont signés par défaut, sauf si vous compilez avec un pavillon particulier. Lorsque vous traitez avec des octets assurez-vous toujours qu'ils ne sont pas signés; sinon, vous obtiendrez des résultats étonnants si vous voulez les convertir en nombres entiers.OriginalL'auteur Thomas Bonini
À l'aide de l'information provenant de différentes réponses ci-dessus (merci à tous!) Je tiens à poster ce morceau de code qui est une version tronquée en bas de ce que j'ai finalement utilisé.
Il y a cependant une différence entre ce que le code suivant qui fonctionne et ce qui a été décrit dans mon origal question : ce code n'a pas lu le premier octet de l'en-tête de fichier binaire tel que décrit à l'origine, mais à la place lit les 11 et 12 octets (décalages 10 & 11) de l'entrée binaire du fichier (un .Fichier DBF). Les 11 et 12 octets contiennent la longueur d'un enregistrement de données (c'est ce que je veux savoir en fait) avec l'Octet le Moins Significatif positionné en premier: par exemple, si les 11 et 12 octets sont respectivement : 0x06 0x08, la longueur d'un enregistrement de données serait 0x0806 octets, ou 2054bytes en décimal
}
OriginalL'auteur Esquif