二进制格式的pdf

2024-05-16 10:10:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解二进制文件是如何工作的。 我用python解释器打开了二进制格式的pdf文件(书页),然后在屏幕上打印了部分内容:

b'%PDF-1.4\r\n%\xe2\xe3\xcf\xd3\r\n19 0 obj\r\n<<\r\n/Linearized 1\r\n/L 60759\r\n/H [ 1325 184 ]\r\n/O 21\r\n/E 58759\r\n/N 1\r\n/T 60252\r\n>>\r\nendobj\r\n ...

文件的主要内容如下所示:

\r\nstream\r\nh\xde\x1c\xc3\x03\x90\x10\x08\x00\x00\xc0\xcb\xae\xcf\xc6\x7f\xb6\xed\xfal\xdb\xb6\x8d\xc9\xb6m\xdb\xb6m\xdb\xb6];\xed\xcc\x06\x04\xfc\x15\xc8\xc0\x061\xa8\xc1\x0cn\x08C\x1a\xca\xd0\x861\xac\xe1\x0co\x04\xff1\xa2\x91\x8cl\x14\xa3\x1a\xcd\xe8\xc60\xa6\xb1\x8cm\x1c\xe3\x1a\xcf\xf8&\xf0_\xff3\xa1\x89Ll\x12\x93\x9a ...

若我理解正确,解释器已经将所有可能的二进制文件转换为文本-这里我们收到文本“nendobj”,“线性化”,等等。我检查了其他符号组合,f.e.\xde,它们不是有效的二进制文件。那么它们代表什么呢


Tags: 文件内容二进制解释器x00xcfxe3x1a
2条回答

二进制文件的工作原理

几乎所有计算机和网络流或文件都是二进制的,即0或1位(只有少数可能是量子位)。它们可以串行或并行方式移动或存储。最初很容易使用“byeightes”来描述8位(通常是并行的),并将其显示为两个十六进制字符(每个字符都是半字节)。现代计算机倾向于以并行方式传输64位数据,但我们坚持更容易建立的旧约定

一个有效的PDF必须以一个“标题”开头,即0010010101010000100010001000101101这是它的40位二进制签名,在Adobes 2008标准定义中,它被描述为8位注释的一部分,然后还指示版本号

Adobe和其他PDF阅读器允许使用某些PDF,如果数字签名(包括终端行馈送)位于前1K块(8192位或1024字节)的某个位置,那么这些文件(签名不是直接在开始处)现在应该被重写为无效

当我们将二进制转换为人类术语时,我们将字节视为光学字符,因此当翻译时,这40位的5字节看起来像^ {CD1>},并且您的视图显示,作为二进制二进制符号后面的“B”,后面是%PDF1.4,那么\R(表示“强> R< /强>打印机机架”)和\n。(表示将纸张向上移动以形成一条Newline,人类的感知再次表示我们向下移动页面!)

在另一种表示法中,这些\r\n被显示为CR LF(通常是dos/windows结构),它们有时也被显示在\hexidecimal中,作为一个16位的“单词”0D0A,在python语言中可以显示为\x0d\x0a,但实际上它们是二进制文件00001101010,不利于人类

经过一段时间后,你可以识别和阅读不同类型的人类速记,因为阅读二进制文件将有点太难了

所以一个PDF可以用7位ASCII纯文本写,比如说记事本,但是这些字符被移动为64位,存储为8位字节,这实际上是二进制的,但是我们把这些文件描述为非二进制的,因为它们只有几个8位字符!!困惑吗

以后编辑 如果我们看一下您的PDF标题,我们会看到这个结构,第19个object按编号放置在第一个位置),您发现它是线性化的This information is then web served as sequential content "chunks" of PDF binary. 因此,我们可以非常肯定地说,该文件被归类为“二进制文件”(但所有打印输出文件都是actually二进制文件:-)

%PDF-1.4
%âãÏÓ
19 0 obj
<<
/Linearized 1
/L 60759
/H [ 1325 184 ]
/O 21
/E 58759
/N 1
/T 60252
>>
endobj

短标题几乎没有透露文件的信息。接下来的几个对象为我们提供了有关页面大小或编辑器历史记录的大部分信息。然而,我会冒险猜测,这是一个猜测,低水平的数字表明在页面上几乎没有对象,因此它很可能是一个页面的图片文本,因此不是文本

“二进制文件如何工作”的问题太广泛,因为例如JPEG文件、MP3文件、可执行程序。。。是“二进制文件”。Heck,即使UTF-8文本文件是二进制文件,如果你认为“文本文件”只是一个人类可读的字节子集。

If I understand it correctly, interpreter already converted all binaries it could into text

您看到的是bytes对象的Pythonrepr();这不是原始内容。所有的\x..序列都是字节的Python转义序列,否则就无法表示为ASCII文本

瞧,表示与您打开并读取的文件中的表示不同

要查看同一二进制文件的另一种表示形式,您可能需要尝试在十六进制编辑器中打开它。下面是我在xxd十六进制转储程序中运行的任意PDF输出的开始:

00000000: 2550 4446 2d31 2e33 0a25 c7ec 8fa2 0a38  %PDF-1.3.%.....8
00000010: 2030 206f 626a 0a3c 3c2f 4c65 6e67 7468   0 obj.<</Length
00000020: 2039 2030 2052 2f46 696c 7465 7220 2f46   9 0 R/Filter /F
00000030: 6c61 7465 4465 636f 6465 3e3e 0a73 7472  lateDecode>>.str
00000040: 6561 6d0a 789c cd5b 4fa8 1e57 1547 d445  eam.x..[O..W.G.E
00000050: 3f1e 2fbc d7b4 f4d5 68a7 a142 429b dbfb  ?./.....h..BB...
00000060: 7fee d59d 6083 56a4 090f 41f9 68d1 bc24  ....`.V...A.h..$
00000070: 6d62 be9a 2fd6 18e8 52c5 9d20 e8b2 942a  mb../...R.. ...*

左边是文件的十六进制偏移量,后面是文件中的十六进制字节,右边是可以表示为文本的字符表示(不能表示的是.)。您可以看到相同的%PDF-...头出现在那里,但没有\xe2等等,因为它们只是一个表示

至于PDF文件格式的规范,您可以在Adobe的网站上找到它(作为PDF…)https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf

相关问题 更多 >