我想读取一些带有十六进制值的文件。比如这一个:
^@\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值)
答案 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
等。