什么是文件?
文件是数据存储的基本单位,linux也有着万物皆文件的思想,因此本文想深入探讨一下文件的相关知识。
/boot文件包含启动加载器相关文件,例如linux内核和初始RAM磁盘映像。 /etc包含所有系统级的配置文件,例如文件系统挂载信息、用户账户信息、用户组信息等。 /bin包含基本用户命令的可执行文件,比如ls、cp等等。 ...
文件的分类
不同的操作系统文件的分类有所不同,本文主要以linux为主,windows也有类似的思想,只是在一些概念上有所不同。 在操作系统层面,文件可以被分为以下几类。
- 普通文件(Regular file) 这类文件一般包含用户数据,比如图像文件、二进制文件、文本文件等等。
- 目录(Directory) 目录是一种特殊的文件,用于包含其它文件和目录。目录文件可以通过ls指令去查看其内容。
- 符号链接(Symbolic link) 符号链接是一种指向另一个文件的引用,它允许文件间的快速访问和链接,通常用于创建对常用文件或目录的链接方式。
- 设备文件(Device file) 这些文件表示系统中的物理设备或特殊的接口,通常分为字符设备文件和块设备文件。字符设备文件允许字符(字节)级的数据处理,而块设备文件则支持批量的数据处理。
- 命名管道(Named pipe) 它是一种允许进程间通信的特殊文件。数据写入一个命名管道后可以被另一个进程读取,从而实现进程之间的信息传递。
文件格式及其结构组成
文件格式指的是用于存储在计算机文件系统中的数据的编码方式。文件格式能够决定数据如何组织和存储,并且通常与文件拓展名(比如说.jpg
,.mp4
等等)相关联,通过不同的后缀名,能够让操作系统和应用程序合理的处理文件。不同的文件格式适用于不同的应用和数据类型。 下面以.jpg为例,从文件头、段结构、各段内容几个部分来进行分析。
JPG文件分析
文件头
JPG文件通常以两个字节的起始标记开始,称为SOI(Start of Image),其值为0xFFDB。这表示文件的开始。
JPG段结构
JPG文件由多个段来构成,每个段都有特定的标记,后跟一个标记字节。常见的段包括:
- SOI(Start of Image):0xFFD8
- APP0(JFIF APP0)
- SOI(Start of Image):0xFFD8
- APP0(JFIF APP0 Marker):0xFFE0
- DQT(Define Quantization Table):0xFFDB
- SOF0(Start of Frame):0xFFC0
- DHT(Define Huffman Table):0xFFC4
- SOS(Start of Scan):0xFFDA
- EOI(End of Image):0xFFD9 每个段的一般结构如下:
- 标记头(2字节):0xFF+标记字节
- 长度字段(2字节):段的总长度,包括长度字段本身
- 段内容:实际内容 于是一个JPG可以简单的像下面这样表示
[compressed image data] FFD9 -- EOI (End of Image) 下面以一个实际的图片来寻找这些数据,可以看到,一个JPG文件就由这些数据分成了一个个小段。FFD8 -- SOI (Start of Image) FFE0 0010 4A464946 000101 000001 0001 0000 -- APP0 (JFIF header) FFDB 0043 00 [64 bytes of quantization table] -- DQT (Define Quantization Table) FFC0 0011 08 00F0 00A0 03 01 11 00 02 11 01 03 11 01 -- SOF0 (Start of Frame) FFC4 001F 00 [Huffman table data] -- DHT (Define Huffman Table) FFDA 000C 03 01 00 02 11 03 11 00 3F 00 -- SOS (Start of Scan)
总结
文件是数据存储和管理的基本单位,不同类型的文件在操作系统中具有各自独特的功能和作用。从普通文件到目录、符号链接、设备文件和命名管道,每一种文件类型都为系统的高效运行提供了基础。 文件格式决定了数据的组织和存储方式,通过了解如JPEG文件的结构和组成,可以更好地理解和处理图像数据。