Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Linux如何将文件识别为特定的文件类型,以及如何以编程方式更改它?_Java_Linux_Byte_File Type - Fatal编程技术网

Java Linux如何将文件识别为特定的文件类型,以及如何以编程方式更改它?

Java Linux如何将文件识别为特定的文件类型,以及如何以编程方式更改它?,java,linux,byte,file-type,Java,Linux,Byte,File Type,我正在用java编写一个程序,该程序读取文件的输入流,根据密码更改字节数对其进行加密,并创建一个新的加密文件 例如: 我创建了一个包含以下文字的测试文件: 这是一个测试,看看加密机项目是否有效。 当我用java读取字节时,我得到: [84、104、105、115、32、105、115、32、97、32、116、101、115、116、32、115、101、101、32、105、102、32、116、104、101、32、101、110、110、99、114、121、112、116、101、114

我正在用java编写一个程序,该程序读取文件的输入流,根据密码更改字节数对其进行加密,并创建一个新的加密文件

例如:
我创建了一个包含以下文字的测试文件:
这是一个测试,看看加密机项目是否有效。

当我用java读取字节时,我得到:
[84、104、105、115、32、105、115、32、97、32、116、101、115、116、32、115、101、101、32、105、102、32、116、104、101、32、101、110、110、99、114、121、112、116、101、114、32、112、111、106、101、99、116、32、119、111、114、107、115、46、10]

然后取每个字节的值,减去密码的unicode值,得到密码的绝对值。然后我把它写入一个文件

我在玩不同的加密算法,并开始在一个测试文本文件上测试它。我使用的是Linux,因此没有文件扩展名(例如.txt、.pdf等)。经过几次加密后,我注意到计算机不再将其识别为文本文件,而是图像文件!(默认情况下,当您单击它时,它会尝试在图像编辑器中打开该文件)

下面是我的问题:

1.是什么导致计算机将文件识别为特定的文件类型?
  • 我猜它与它在文件中某个地方查看的某些字节有关,但除此之外,我迷路了
2.该信息存储在文件的何处?
  • 我希望即使在加密后也能将文件保持为相同的文件类型,因此我在想,例如,如果文件类型信息在前10个字节中,我会在那之后对所有内容进行加密,但不要使用前10个字节
3.文件类型信息是标准的吗?
  • 这些字节的含义是否在所有平台上都是标准的(即,无论您在哪台计算机上使用pdf文件,pdf文件都是pdf文件。这是因为扩展名
    .pdf
    ,还是因为文件中的某个字节。)
4.假设由于文件中的字节而识别文件类型,如何更改文件类型?
  • 在哪里可以找到文件中字节的列表

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

file
命令使用
magic
配置文件(通常为
/etc/magic
,或
/usr/share/file/magic
),其中包含定义这些字节模式的规则


就是这样-没有特殊的额外元数据-所有这些都是通过分析内容完成的。

通常在文件的前几个字节内

发件人:

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

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

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

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

合并此类元数据(通常与Unix及其派生版本相关)的一种方法是在文件本身中存储一个“幻数”。最初,该术语用于文件开头的一组特定的2字节标识符,但由于任何未编码的二进制序列都可以被视为一个数字,因此文件格式中唯一区分它的任何特征都可以用于识别。例如,GIF图像总是以GIF87a或GIF89a的ASCII表示形式开始,具体取决于它们所遵循的标准。许多文件类型,尤其是纯文本文件,很难用这种方法识别。例如,HTML文件可能以字符串开头(不区分大小写),或者以
文件类型甚至不必存储在文件中。其他方法包括,甚至

存储文件格式的最后一种方法是在文件系统中显式存储有关格式的信息,而不是在文件本身中。 这种方法将元数据与主数据和名称分开,但也减少了por