我们的目标是读取文件并将缓冲区直接写入标准输出,以便进一步处理。 这如预期的文本文件,图像和PDF。 但是在阅读PDF文件时,在shellinput中会显示一个奇怪的input:62; 9; c62; 9; c62; 9; c62; 9; c。 我在Ubuntu 14.04.3 LTS(14.04)上编译test.c。
贝壳
user@user-virtualmachine:~$./test <prints binary data here ... ... end of binary data> user@user-virtualmachine:~$62;9;c62;9;c62;9;c62;9;c
当我检查md5sum这是一个比赛,所以没有什么奇怪的:
md5sum paper.pdf 5152a6c5b7deb364385fb3dd27c586db paper.pdf ./test | md5sum 5152a6c5b7deb364385fb3dd27c586db -
我试图在网上查找它,它说,一些二进制数据可能会导致shell写入到标准输出时以意想不到的方式行事。 这个问题能解决吗? 代码如下所示。
TEST.C
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main() { ssize_t bytes_read; char buffer[1024]; int fd; fd = open("paper.pdf", O_RDONLY); if(fd < 0) { perror("Error in reading file"); exit(1); } do { bytes_read = read(fd, buffer, 1024); if(bytes_read > 0) { write(fileno(stdout), buffer, bytes_read); } } while(bytes_read > 0); close(fd); return 0; }
PDF文件是二进制文件。 虽然它们可以包含文本,但它们可以包含非文本数据。
要解决这个问题:不要将二进制数据转储到你的shell的输出。 二进制数据来自哪里并不重要 – 试试cat /usr/bin/bash
。 你会得到相同的结果。 防止这种“搞乱”你的shell的输出的唯一方法就是不要这样做。