从 PDF 等二进制文件中读取文本

2024-05-07

我在 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(使用前将#替换为@)

从 PDF 等二进制文件中读取文本 的相关文章

随机推荐

  • IntelliJ IDEA 中的自动错误检测

    我是 Java 编程语言和 IntelliJ IDEA 2017 1 IDE 的新手 我刚刚安装了 IDE 并激活了所有各种检查 但每当我犯了错误 例如省略括号或分号 时 IDE 都无法检测到错误 此图像显示激活的检查 This is a
  • WordPress 3.3 CSS 中的相对路径

    我想添加一个图像作为标题的背景 问题是我不想添加绝对路径 因为我是在我的电脑上执行此操作 并且它们要上传到我的服务器 应该在CSS中工作 它在这里不起作用 code branding background url images backgr
  • 如何将自定义 CSS 添加到脆皮表单?

    我正在尝试在脆皮表单的帮助下为我的网站创建一个响应式表单 我没有使用引导程序 我想将自定义 CSS 添加到脆皮表单以匹配我的整个网站 HTML
  • C#.NET VS2010 断点不起作用

    当我去调试代码时 所有断点都被透明填充 只留下轮廓 并且中间有一个感叹号的小三角形位于断点的角落 当我将鼠标悬停在断点上时 错误是 当前不会命中断点 源代码与原始版本不同 我在一个多小时内没有尝试调试我的代码 在此期间我添加了一个具有多个线
  • Mac 10.8.3 上的 fltk 安装

    我正在挣扎fltk在我的 Mac 上安装 我想在Xcode 4 下载文件并解压缩后 尝试按照说明操作 2 3 Configuring FLTK Stay in your FLTK source code directory Type aut
  • 如何检查有效的电子邮件地址? [复制]

    这个问题在这里已经有答案了 有没有一种好方法可以使用正则表达式检查表单输入以确保它是正确样式的电子邮件地址 从昨晚开始就一直在搜索 如果它是子域名电子邮件地址 那么每个回答过人们有关该主题的问题的人似乎也有问题 无关紧要 即使您可以验证电子
  • 如何从 C 文件更改终端中的目录

    如何从 C 程序更改将在终端上生效的目录 实际上不要告诉 system 函数或 chdir 函数 这些仅适用于 C 中的进程或子 shell 假设我正在从 bash shell 执行一个 C 程序 其进程 ID 为 10223 那么 我可以
  • 如何在 AsyncTask 的 postExecute 方法中获取 Map 的结果?

    如何在AsyncTask的postExecute方法中获取Map的结果 我无法在结果中获取结果 Override protected void onPostExecute Map
  • Pipe 和 Tap VS 使用 ngxs 订阅

    我正在玩管道并订阅 如果我使用带有水龙头的管道 则控制台中不会登录任何内容 如果我使用订阅 它就可以工作 那么我做错了什么 import Observable from rxjs import tap take from rxjs oper
  • 让 SSLEngine 在 Android (4.4.2) 上使用 TLSv1.2?

    伙计们 我希望我遗漏了一些明显的东西 并且我希望有人能够提供一些线索 我正在尝试让 TLSv1 2 在 SSL NIO 上下文中运行 使用Android异步 https github com koush AndroidAsync库 所以我尝
  • 如何使用 ffmpeg 提取时间精确的视频片段?

    这并不是一个特别新的问题领域 但我已经尝试过那里建议的内容 但运气不佳 那么 我的故事 我有一大段 15 秒的直接来自camera mov 视频 我想从中提取特定的块 我可以通过开始时间和停止时间 以秒为单位 来识别该块 我首先尝试执行我称
  • 无效号码错误!似乎无法绕过它

    Oracle 10g 数据库 我有一张桌子叫s contact 这个表有一个字段叫做person uid This person uid字段是 varchar2 但包含某些行的有效数字和其他行的无效数字 例如 一行可能有一个person u
  • 选项卡的 AngularJS 控制器

    我的页面中有三个选项卡 我在用着tabset and tab根据Angular 引导文档 https angular ui github io bootstrap tabs 我设置了一个控制器 div 其中有tabsetas div cla
  • 从 gitlab docker runner 启动声纳扫描仪

    我有一个 CI 工作流程 集成了 linting 作业和代码质量作业 我的 Linting 工作是一个 docker runner 从应用程序代码启动我的 eslint 脚本 然后我的代码质量工作应该启动声纳扫描仪泊坞窗实例 检查我的代码并
  • 可扩展列表指示器

    我有一个可扩展的列表 所以两个问题 我见过一些类似的问题 但从未找到答案 我该怎么办 隐藏箭头 组指示器 当没有孩子的时候 我尝试在适配器中执行此操作 public View getGroupView int groupPosition b
  • 保存散点图动画

    我一直在尝试使用 matplotlib 保存动画散点图 并且我希望它不需要完全不同的代码来查看动画图形和保存副本 该图完美显示了保存完成后的所有数据点 这段代码是修改后的版本Giggi s https stackoverflow com a
  • 在 Javascript 中获取不带模 (%) 运算符的余数,占 -/+ 符号

    对于家庭作业 我需要返回 num1 除以 num2 后的余数 而不使用内置模 运算符 我可以使用以下代码让大多数测试通过 但我一直不知道如何解释给定数字的 符号 我需要保留 num1 上的任何一个符号 并且如果 num2 为负数 还返回一个
  • springdoc-openapi:如何添加POST请求的示例?

    Controller有以下方法 ApiResponses value ApiResponse responseCode 200 GetMapping value API URI PREFIX PRODUCTS URI produces Me
  • Linux:通过网络进行屏幕桌面视频捕获和 VNC 帧速率

    抱歉 文字墙很长 TL DR VNC 连接的帧速率是多少 以帧 秒为单位 或者更确切地说 由谁决定 客户端还是服务器 对于桌面屏幕捕获的任何其他建议 但 正确的时间编码 具有不抖动的帧速率 具有稳定的周期 并有可能将其作为未压缩 或无损 图
  • 从 PDF 等二进制文件中读取文本

    我在 C 中读取二进制文件时遇到问题 目前我的代码是这样的 FILE s fopen source rb fseek s 0 SEEK END size file size ftell s rewind s char sbuffer cha