【问题标题】:How to read (with read()) an hex and print it on screen?如何读取(使用 read())十六进制并在屏幕上打印?
【发布时间】:2014-04-10 12:04:22
【问题描述】:

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

^@\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 等标志表示十六进制,它会随机值)

【问题讨论】:

  • 你需要告诉我们你得到了什么,出了什么问题。
  • 它什么也没给我打印,只是空白。如果我尝试使用 printf 打印(使用 %x 等标志表示十六进制,它会随机值)
  • 好的,现在把评论变成一个句子,然后编辑你的问题,让它这样说。
  • 是不是因为你的代码编译失败?我需要#include &lt;fcntl.h&gt; 才能编译。但是当它发生时,它就起作用了。
  • 是的,我太傻了,忘记了 open() 的一个包含。但仍然对我不起作用。好吧..如果我手动写“^@\352\203\363”,那工作,但我得到的那个是用红色写的。这是我正在打开的文件的链接。 partage-facile.com/0L9FOY7ERB/toto.cor.html

标签: hex printf


【解决方案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 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多