从二进制文件(如PDF)中读取文本

问题描述 投票:-1回答:2

我在C++中遇到一个读取二进制文件的问题。目前我的代码是这样的。

FILE *s=fopen(source, "rb");
fseek(s,0,SEEK_END);
size_file size=ftell(s);
rewind(s);

char *sbuffer=(char *) malloc(sizeof(char) * size);
if(sbuffer==NULL){
    fputs("Memory error", stderr);
    exit(2);
}
size_t result=fread(sbuffer,1,size,s);
if(result != size){
    fputs("Reading error",stderr);
    exit(3);
}
fclose(s);
cout<<sbuffer<<endl;

但是在终端上打印出来的字符都是随机的 而不是我写在PDF文件里的字符 它们是这样的。

% P D F - 1 . 3 
 % ? ? ? ? ? ? ? ? ? ? ? 
 4   0   o b j 
 < <   / L e n g t h   5   0   R   / F i l t e r   / F l a t e D e c o d e   > > 
 s t r e a m 
 x  ? ? ? j ? 0  E ? ? ? k ?  y Q E # ? ? ? m ? & ? ? @  % + ? .     ? ?  ? ? A i  ?     4 z \ 1 G W ? ?  - , ? ? ? (  ? ? ?  9 ? ? ? ? ?  \ ? } ? ? ? e ? ? ? ? 0 ? ? ? ~ ? , ? ? & 8 ? ? x e 4 ? r 
 | ? ? ? 
          ? ? ? ? E  > a ? ? z & ? Z ? < ?  }  '  ? ? ? j p ? ? Q 7 0 ? ? ? S %  - p ? ? ? 7 D  ?  ? ? ' Q z Q ?  ? ? ? ? ? ? ? ? ? \ 2 ? ? 7 ? ? ? < ? ? D ~  ? ? ? 

 e n d s t r e a m 
 e n d o b j 
 5   0   o b j 
 2 2 8 
 e n d o b j 
 2   0   o b j

还有很多类似上面的字符 00 顺便说一下,我想写一个压缩器,它把二进制文件作为输入和输出。在这里非常感谢任何帮助!

c++ file-io
2个回答
5
投票

只有少数文件格式,如普通的原始.TXT文本文件可以直接 "读取 "和 "理解"。大部分的文件格式,包括几乎所有的二进制格式,都是一个.TXT文件格式。格式化. 这意味着某些 架构 文件内部所持有的。与完全没有结构的.TXT文本文件完全相反,或者说,它是一个巨大的纯数据块。

打开一个WordPad或Word或任何其他 聪明一点 文本编辑器,并在那里写一些文本,然后将其保存为RTF,DOC,ODT或任何其他非TXT文件。然后把它也保存为TXT文件。

下载一个HEX VIEWERHEX EDITOR。不管是哪一种。就拿那些免费的来说吧,你不需要太多的功能,只需要一个能在一列显示原始二进制值,另一列显示ASCII文本的。几乎所有的免费的十六进制查看器都可以做到这一点。

打开并比较这两个文件。你会立即看到差异。

回到PDF。

PDF甚至可以包含与文本交错的图形。如果文本像在TXT中一样 "只是坐在文件中",你希望如何保存它?如何将图像位置描述数据嵌入?如果我记得不错,PDF甚至可以包含脚本,类似于JavaScripts。可执行的。在PDF类型的文档中,你可以有按钮来做一些事情。这比单纯的文本文件要复杂得多。

二进制文件通常不包含任何纯文本,你的眼睛可以读到。它们的文本结构是块状的,被包裹在关于颜色、文本布局、分页等元数据中,甚至是关于文档版本、编写、分类等特殊结构中,(...)。这一切都必须存储在某个地方。

通常情况下,二进制文件有几个部分。第一部分通常称为 HEADER。里面会有以下信息:格式类型,格式版本,文件块数据长度,图像分辨率,以及类似的信息。所有这些信息很可能以二进制形式保存:没有 "800x600 "文本,只有"/en.wikipedia.orgwikiEntropy_(information_theory)"。

. 然后试着玩玩RLE (

http:/www.daniweb.comsoftware-developmentcppcode216388basic-rle-file-compression-routine)或赫夫曼(http:/www.cprogramming.comtutorialcomputersciencetheoryhuffman.html)就从比较简单的东西开始。然后开始多读一些关于赫夫曼代码的书,然后,好了,你就会合理地准备好任务,比如ZIP或LZH... 要将PDF解析为文本,可以使用一些PDF库,如

gnupdf

3
投票

弹射器.

© www.soinside.com 2019 - 2024. All rights reserved.