C编程:如何从二进制文件中读取和打印一个字节?

Esq*_*uif 4 c

我希望打开一个二进制文件,读取文件的第一个字节,最后将十六进制值(字符串格式)打印到stdout(即,如果第一个字节是03十六进制,我希望打印出0x03例如) .我得到的输出与我在样本二进制文件中所知的不一致,所以我想知道是否有人可以帮助解决这个问题.

这是代码:

#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;   
}
Run Code Online (Sandbox Code Playgroud)

该计划编制如下:

gcc rd_byte.c -o rd_byte

运行如下:

rd_byte BINFILE.bin

知道使用的样本二进制文件有03作为其第一个字节,我得到输出:

str_buf = <0x22cce3>

我期望的是str_buf = <0x03>

我的代码中的错误在哪里?

感谢您的任何帮助.

Nic*_*yer 7

您正在打印指针的值raw_buf,而不是该位置的内存:

sprintf(str_buf,"0x%x",raw_buf[0]);
Run Code Online (Sandbox Code Playgroud)

正如安德烈亚斯所说,str_buf也不够大.但是:不需要第二个缓冲区,你可以直接调用printf.

printf("0x%x",raw_buf[0]);
Run Code Online (Sandbox Code Playgroud)


CB *_*ley 5

我认为您使事情过于复杂,并在不必要的地方使用了不可移植的结构。

你应该能够做到:

#include <stdio.h>

int main(int argc, char** argv)
{
    if (argc < 2)
        return 1; /* TODO: better error handling */

    FILE* f = fopen(argv[1], "rb");

    /* TODO: check f is not NULL */

    /* Read one byte */    
    int first = fgetc(f);

    if (first != EOF)
        printf("first byte = %x\n", (unsigned)first);

    /* TODO else read failed, empty file?? */

    fclose(f);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Die*_*ano 5

少即是多...

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
    int fd;
    unsigned char c;

    /* needs error checking */
    fd = open(argv[1], O_RDONLY);
    read(fd, &c, sizeof(c));
    close(fd);

    printf("<0x%x>\n", c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. seek不需要
  2. 如果你想读一个字节使用一个 unsigned char
  3. printf 将做格式

  • 我认为接近(fd); 也是必需的 (2认同)