Linux如何识别某个文件的文件类型,并如何以编程方式更改它?

8 浏览
0 Comments

Linux如何识别某个文件的文件类型,并如何以编程方式更改它?

我正在用Java编写一个程序,它可以读取文件的输入流,根据密码改变字节的顺序对其进行加密,并创建一个新的加密文件。\n例如:\n我创建了一个测试文件,其中包含以下文字:\nThis is a test to see if the encrypter project works.\n在Java中读取字节后,我得到的结果是:\n[84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 116, 101, 115, 116, 32, 116, 111, 32, 115, 101, 101, 32, 105, 102, 32, 116, 104, 101, 32, 101, 110, 99, 114, 121, 112, 116, 101, 114, 32, 112, 114, 111, 106, 101, 99, 116, 32, 119, 111, 114, 107, 115, 46, 10]\n然后,我将每个字节的值减去密码的Unicode值,并取绝对值。然后将其写入文件中。\n我尝试使用不同的加密算法,并在测试文本文件上进行了测试。我使用的是Linux系统,所以没有文件扩展名(例如.txt,.pdf等)。我注意到在加密几次后,计算机不再将其识别为文本文件,而是将其识别为图像文件!(这意味着当您单击它时,默认情况下它会尝试在图像编辑器中打开文件)\n以下是我的问题:\n

1. 计算机是如何识别文件的特定文件类型的?

\n

    \n

  • 我猜测它与文件中某个地方的特定字节有关,但除此之外,我一无所知。
  • \n

\n

2. 这些信息存储在文件的哪个位置?

\n

    \n

  • 我希望在加密后仍然保持文件的相同文件类型,所以我想,如果文件类型信息在前10个字节中,我将加密后面的所有内容,但保持前10个字节不变。
  • \n

\n

3. 文件类型信息是否标准化?

\n

    \n

  • 这些字节是否在所有平台上都具有相同的含义(例如,无论在哪台计算机上使用,pdf文件都是pdf文件)?这是因为有了.pdf扩展名,还是因为文件中的某些字节?
  • \n

\n

4. 假设文件类型是通过文件中的字节识别的,我如何更改文件类型?

\n

    \n

  • 我在哪里可以找到文件中字节的含义列表?
  • \n

0
0 Comments

Linux识别文件类型的方法主要有以下几种:在文件的开头几个字节中存储文件类型信息、在文件头中存储元数据、使用魔数存储文件类型、使用文件扩展名存储文件类型、在外部存储文件格式元数据。

首先,文件类型通常会存储在文件的开头几个字节中。这些字节可以是二进制字符串,也可以是标记或原始文本,固定地放置在文件的特定位置。如果这个区域的大小超过几个字节,通常被称为文件头;如果只有几个字节,通常被称为魔数。

然而,文件类型并不一定存储在文件的开头几个字节中,也可以存储在其他位置。文件头中包含的元数据不一定只存储在开头,还可以出现在文件的其他位置,通常包括文件的末尾。字符型(文本)文件具有基于字符的可读的文件头,而二进制格式通常具有二进制文件头,但这并不是绝对的规则:可读的文件头可能需要更多的字节,但在文本或十六进制编辑器中很容易辨别。文件头不仅可以包含算法所需的识别文件格式的信息,还可以包含关于文件及其内容的真实元数据。例如,大多数图像文件格式会存储有关图像大小、分辨率、颜色空间/格式以及可选的其他作者信息(比如Exif中的拍摄参数)的信息。这些元数据可以在加载文件时和之后由读取或解释文件的程序使用,同时也可以被操作系统用于快速获取有关文件本身的信息而无需全部加载到内存中。

另一种在文件中存储文件类型的方法是使用魔数。魔数是一种在文件中存储元数据的方式,通常与Unix及其派生系统相关。最早,该术语用于指代文件开头的一组特定的2字节标识符,但由于任何未解码的二进制序列都可以被视为数字,文件格式的任何唯一区分特征都可用于识别。例如,GIF图像总是以ASCII表示的GIF87a或GIF89a开头,具体取决于它们所遵循的标准。但是,使用这种方法很难识别许多文件类型,特别是纯文本文件。例如,HTML文件可能以字符串开头(不区分大小写),或以适当的文档类型定义开头。

文件类型甚至可以不存储在文件中。其他方法包括使用文件扩展名或在文件系统中显式存储与格式有关的信息。将元数据与主要数据和名称分开存储可以保持元数据的独立性,但与文件扩展名或魔数相比,这种方法的可移植性较差,因为格式必须从文件系统转换为文件系统。虽然文件扩展名也有一定程度的这种情况,例如为了与MS-DOS的三个字符限制兼容,但大多数存储形式都有一个大致等价的定义文件数据和名称的方式,但可能对进一步的元数据具有不同或没有表示。

除了上述方法外,还有许多其他方法,但这些是最常见的。

0
0 Comments

在传统的UNIX系统中,文件仅通过查找文件中出现的特定字节模式来识别。文件命令使用一个名为“magic”的配置文件(通常是/etc/magic或/usr/share/file/magic),其中包含定义这些字节模式的规则。没有特殊的额外元数据,一切都是通过对内容的分析完成的。这是真的,因为它源自于魔术数字。

它是如何分析它们的(在文本文件中查找什么内容)请参考man file和man magic - 所有的信息都在那里。如果没有识别出任何二进制格式,剩下的就是7位ASCII码的文本文件了。

文章题目:Linux如何识别文件类型以及如何以编程方式更改文件类型?

在传统的UNIX系统中,文件仅通过查找文件中出现的特定字节模式来识别。文件命令使用一个名为“magic”的配置文件(通常是/etc/magic或/usr/share/file/magic),其中包含定义这些字节模式的规则。这种识别方法源自于魔术数字的概念。

要了解文件命令是如何分析文件的,可以参考man file和man magic命令的文档。在这些文档中,可以找到关于文件命令如何识别文本文件的信息。文本文件是在没有识别出任何二进制格式的情况下剩下的,它的内容只包含了7位ASCII码。

如果想以编程方式更改文件的类型,可以通过修改文件的字节内容来实现。具体来说,可以通过修改文件中的特定字节模式来改变文件的类型。例如,可以使用文件命令的配置文件,在其中定义新的字节模式规则,然后将这些规则应用到文件中。这样,文件命令就会根据新的规则来识别文件的类型。

总结起来,Linux可以通过查找文件中的特定字节模式来识别文件的类型。文件命令使用一个名为“magic”的配置文件来定义这些字节模式的规则。要以编程方式更改文件的类型,可以通过修改文件的字节内容并根据新的规则进行识别。这种方法可以实现对文件类型的灵活控制。

0