是什么导致计算机将文件识别为某种文件types? 以及如何改变它(与Java)?

我正在创build一个java程序,它读取一个文件的inputstream,通过根据密码更改字节数来encryption它,并创build一个新的encryption文件。

例如:
我创build了一个包含以下文字的testing文件:
This is a test to see if the encrypter project works.
当我读取java中的字节时,我得到:
[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]
那么我取每个字节的值,并减去密码的Unicode值,并得到它的绝对值。 然后我写到一个文件。

我正在玩不同的algorithm来encryption它,并开始在testing文本文件上进行testing。 我正在使用Linux,因此没有文件扩展名(例如.txt,.pdf等)。我经过几次encryption后注意到,计算机不再将其识别为文本文件,而是,作为一个图像文件! (意思是当你点击它时,默认情况下它会尝试在图像编辑器中打开文件)

所以这是我的问题:

1.什么导致计算机将文件识别为某种文件types

  • 我猜测它与某些字节有关,它看起来在文件的某个地方,但除此之外,我迷路了。

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

  • 我希望能够保持文件相同的文件types,即使encryption后,所以我想,如果,例如,文件types的信息是在前10个字节,我会encryption一切后,但是例如只保留前10个字节。

3.文件types信息是否标准?

  • 这些字节是否具有所有平台上的标准含义(例如,pdf文件是pdf文件,而不是使用什么计算机,是因为.pdf扩展名,还是因为字节在某处在文件中)。

4.假定由于文件中的字节而识别文件types,我如何更改文件types?

  • 我在哪里可以find什么字节是什么文件的列表?

Solutions Collecting From Web of "是什么导致计算机将文件识别为某种文件types? 以及如何改变它(与Java)?"

在传统的UNIX系统上,文件只能通过查找文件中出现的特定字节模式来识别。

file命令使用一个magic配置文件(通常是/etc/magic/usr/share/file/magic ),它包含定义这些字节模式的规则。

就是这样 – 没有特别的额外元数据 – 这一切都是通过分析内容来完成的。

通常它会在文件的前几个字节之内。

维基百科 :

内部元数据
识别文件格式的第二种方式是在文件本身内存储关于格式的信息。 通常,这些信息被写入一个(或多个)二进制字符串中,标记或原始文本放置在文件中固定的特定位置。 由于找到它们的最简单的地方在于它的开始,所以这个区域通常在大于几个字节时被称为文件头,或者如果它只是几个字节长,则被称为幻数。

虽然文件类型不一定要存储在前几个字节中,但可以存储在别处

包含在文件头中的元数据不一定只存在于开始,而是可能存在于其他区域,通常包括文件的结尾; 它取决于文件格式或其包含的数据类型。 基于字符的(文本)文件具有基于字符的人类可读的标题,而二进制格式通常以二进制标题为特征,但这不是一个规则:一个人类可读的文件标题可能需要更多的字节,但可以用简单的文本容易​​辨别十六进制编辑器。 文件标题不仅可以包含算法所需的信息来识别单独的文件格式,还可以包含有关文件及其内容的真实元数据。 例如,大多数图像文件格式存储关于图像大小,分辨率,色彩空间/格式以及可选的其他创作信息的信息,例如谁,何时何地制作,使用何种相机模型和拍摄参数(如果有的话),比较例如Exif ), 等等。 这样的元数据可以被读取或解释文件的程序在加载过程中以及之后使用,但是也可以被操作系统用来快速捕获关于文件本身的信息,而不用将其全部加载到存储器中。

在文件中存储文件类型的另一种方法是使用幻数

通常与Unix及其衍生产品相关联的这种元数据的一种方法就是在文件本身内存储一个“幻数”。 这个术语最初是用于文件开头的一组特定的2字节标识符,但由于任何未解码的二进制序列都可以看作一个数字,所以唯一区分它的文件格式的任何特征都可以用于识别。 例如,GIF图像总是以GIF87a或GIF89a的ASCII表示开始,这取决于它们所遵循的标准。 许多文件类型,尤其是纯文本文件,很难通过这种方法发现。 例如,HTML文件可能以字符串开头(不区分大小写),或以相应的文档类型定义开头

文件类型甚至不必存储在文件中。 其他方法包括文件扩展名甚至外部元数据

存储文件格式的最后一种方法是在文件系统中明确存储关于格式的信息,而不是文件本身。 这种方法保持了元数据与主数据和名称的分离,但也比文件扩展名或“幻数”更便于移植,因为格式必须从文件系统转换为文件系统。 尽管文件扩展名也是如此,例如,为了兼容MS-DOS的三个字符限制,大多数存储形式对文件的数据和名称的定义大致相同,但可能有不同的表示方式元数据。

还有很多其他的方法,但这些往往是最常见的。