意外的input62; 9; c62; 9; c62; 9; c62; 9; c在将缓冲区写入标准输出

我们的目标是读取文件并将缓冲区直接写入标准输出,以便进一步处理。 这如预期的文本文件,图像和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的输出的唯一方法就是不要这样做。