我在 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
还有许多其他类似上述的角色。我尝试搜索很长时间但找不到如何获取实际字符以供以后处理。顺便说一句,我正在尝试编写一个压缩器,它将二进制文件作为输入和输出。非常感谢这里的任何帮助!
只有少数文件格式(例如纯原始 .TXT 文本文件)可以直接“读取”和“理解”。大多数文件格式,包括几乎所有二进制格式,都是..format。这意味着某些结构保存在文件内。与完全无结构的.TXT文本文件完全相反,或者更确切地说,它是一大块纯数据。
打开写字板或 Word 或任何其他至少有点聪明文本编辑器并在其中写入一些文本,然后将其另存为 RTF、DOC、ODT 或任何其他非 TXT 文件。然后也将其另存为 TXT 文件。
下载十六进制查看器/十六进制编辑器。无论哪一个。免费使用其中一个,您不需要太多功能,只需在一列中显示原始二进制值并在另一列中显示 ASCII 文本即可。几乎任何免费的十六进制查看器/编辑器都可以做到这一点。
打开并比较这两个文件。您会立即看到差异。
回到PDF:
PDF 甚至可以包含与文本交错的图形。如果文本像 TXT 中那样“只是放在文件中”,您希望如何保留它?如何嵌入图像位置/描述/数据?如果我没记错的话,PDF 甚至可以包含类似于 JavaScript 的脚本。可执行。在 PDF 类型的文档中,您可以使用执行某些操作的按钮。这比文件中的文本要复杂得多。
二进制文件通常不包含任何您眼睛可读的文本。他们的文本以块的形式结构化,包含在有关颜色、文本布局、分页等的元数据中,甚至包含有关文档版本控制、创作、分类的特殊结构(...)。这一切都必须存储在某个地方。
通常,二进制文件有部分。第一部分通常称为标题。里面会有以下信息:格式类型、格式版本、文件/块/数据长度、图像分辨率等。所有这些最有可能将以二进制形式保存:没有“800x600”文本,只有“|00|00|03|20|00|00|02|58|”假设 32 位 BE。在阅读、解码和理解描述后,您将知道实际数据从哪里开始,数据块如何布局,以及如何解码它们并理解它们包含的内容。
edit:
了解文本文件和二进制文件之间的区别后,请查看以下内容的绝对基础知识http://en.wikipedia.org/wiki/Entropy_(信息理论) http://en.wikipedia.org/wiki/Entropy_(information_theory)。然后尝试玩 RLE (http://www.daniweb.com/software-development/cpp/code/216388/basic-rle-file-compression-routine http://www.daniweb.com/software-development/cpp/code/216388/basic-rle-file-compression-routine)或霍夫曼(http://www.cprogramming.com/tutorial/computersciencetheory/huffman.html http://www.cprogramming.com/tutorial/computersciencetheory/huffman.html)只是从相对简单的事情开始。然后开始阅读有关霍夫曼代码的更多信息,然后,好吧,您将为任务做好合理的准备,例如 ZIP 或 LZH。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)