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.

Nick réponse est bonne. D'un côté, la lseek est inutile (fichier commence à zéro après fopen), et vous pourriez juste printf la valeur directement, au lieu de l'impression sur une chaîne de première ie printf ("0x%x",raw_buf[0]). Utiliser %02x au lieu de %x si vous voulez toujours l'impression que les deux chiffres. Aussi, assurez-vous que raw_buf est déclarée comme unsigned char pour éviter de signer des extensions.

OriginalL'auteur Esquif | 2010-01-08