如何阅读(使用read())十六进制并在屏幕上打印?

时间:2014-04-10 12:04:23

标签: hex printf

我想读取一些带有十六进制值的文件。比如这一个:

^@\352\203\363

或者当您将emacs置于hexl-mode时

00ea 83f3

这是指向我试图打开的文件的链接: http://www.partage-facile.com/0L9FOY7ERB/toto.cor.html

现在我的主要地方是我尝试阅读和打印它:

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

int     main(int ac, char **av)
{
     int fd;
     char tmp[4];

     if ((fd = open(av[1], O_RDONLY)) == -1)
     {
        printf("Open failed.\n");
        return (-1);
     }
     if ((read(fd, tmp, 4)) == -1)
     {
        printf("Read failed.\n");
        return (-1);
     }
     printf("%s", tmp); /* Here I don't know really what to do to print. */
     if ((close(fd)) == -1)
     {
        printf("Close failed.\n");
        return (-1);
     }
     return (0);
}

但它没有打印任何东西,只是空白。如果我尝试使用printf进行打印(使用%x作为hex的标志,它会产生randoms值)

1 个答案:

答案 0 :(得分:1)

它不打印任何东西的原因是第一个字节为空,printf("%s")认为是“字符串结束”。如果数据中没有空字节,则printf将不知道停止的位置,从而导致溢出。

tmp中的内容不是一个C字符串,只是一个4字节的数组。您可以使用以下内容进行打印:

printf("%02x %02x %02x %02x", tmp[0], tmp[1], tmp[2], tmp[3]);

%x是十六进制整数的格式说明符,2是字段长度,0表示如果值短于字段长度,则该值应为零前缀,即值1应打印为01等。