目录
- 0 引言
- 1 文本文件
- 1.1 是如何存储的?
- 1.2 文件拓展名
- 2 二进制文件
- 2.1 是如何存储的?
- 2.2 分类
- 2.2.1 图像文件
- 2.2.2 音频文件
- 2.2.3 视频文件
- 2.2.4 可执行文件
- 🙋♂️ 作者:海码007
- 📜 专栏:C++专栏
- 💥 标题:文件:文本文件和二进制文件 详解
- ❣️ 寄语:人生的意义或许可以发挥自己全部的潜力,所以加油吧!
- 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正
0 引言
文件作为最基础的计算机知识,无时无刻都在使用,但是很少有详细文件的。今天就展开讲一讲电脑中的文件,大致可以分为文本文件和二进制文件。
1 文本文件
1.1 是如何存储的?
在计算机中,文本文件的存储涉及将字符转换为字节序列并存储在文件系统中。以下是这一过程的关键步骤和概念:
-
字符编码:
- 计算机使用字符编码将
文本字符
(如字母、数字、符号)转换为字节
(即 0 和 1 的序列)。最常用的编码包括 ASCII、UTF-8、UTF-16 等。 - ASCII 编码只适用于英文字符和基本符号,每个字符占用一个字节(8位)。
- UTF-8 是一种可变长度的 Unicode 编码,它可以表示世界上几乎所有的字符。英文字符在 UTF-8 中仍然占用一个字节,而其他字符(如中文、阿拉伯文、表情符号)可能占用多个字节。
- 计算机使用字符编码将
-
文件系统:
- 文件系统管理存储设备(如硬盘驱动器、固态驱动器)上的数据,包括文件的创建、读取、写入和删除。
- 当文本文件被保存时,它被写入存储设备上的文件系统。文件系统会为该文件分配空间,并将字节序列存储在这些空间中。
-
文件属性:
- 除了文件内容本身,文件系统还存储有关文件的元数据,如文件名、创建时间、修改时间、文件大小等。
-
行终止符:
- 不同操作系统使用不同的行终止符来表示行的结束。
- Windows 使用回车符和换行符(CRLF,
\r\n
) - 而 Unix/Linux 使用单个换行符(LF,
\n
)。
- Windows 使用回车符和换行符(CRLF,
- 当文本文件在不同的操作系统之间传输时,可能需要转换行终止符。
- 不同操作系统使用不同的行终止符来表示行的结束。
-
存储介质:
- 最终,这些字节被物理地存储在存储介质上,如硬盘、固态硬盘或可移动驱动器。
- 存储介质上的磁性或电子元件会根据文件的字节序列相应地改变状态,以存储数据。
-
文件访问:
- 当需要访问文件时,文件系统会根据文件的存储位置读取字节序列,然后操作系统或应用程序根据相应的字符编码将这些字节转换回字符,以便于显示或处理。
总之,文本文件在计算机中的存储涉及字符到字节的编码转换,以及这些字节在文件系统上的物理存储。这个过程使得文本数据可以被持久化存储,并在需要时进行检索和使用。
1.2 文件拓展名
电脑中的文本文件种类繁多,涵盖了从简单的笔记到复杂的代码和配置文件。以下是一些常见类型的文本文件:
-
普通文本文件:
.txt
:最基本的文本文件,不含格式化,可用任何文本编辑器打开。
-
编程语言源代码文件:
.py
:Python 源代码文件。.java
:Java 源代码文件。.c
/.cpp
:C 或 C++ 源代码文件。.js
:JavaScript 文件。.html
/.css
:用于网页设计的 HTML 和 CSS 文件。
-
配置文件:
.json
:JSON 格式的配置文件,常用于网络通信和数据存储。.xml
:XML 格式的文件,用于数据存储和配置。.ini
:简单的配置文件,包含键值对。.yaml
/.yml
:YAML 格式的配置文件,常用于配置管理和数据序列化。
-
脚本文件:
.sh
:Shell 脚本文件,用于自动化命令。.bat
:Windows 批处理文件。
-
数据文件:
.csv
:逗号分隔值文件,常用于存储表格数据。.log
:日志文件,记录应用程序或系统的操作历史。
-
文档和标记语言文件:
.md
:Markdown 文件,用于编写格式化文档。.tex
:LaTeX 文件,用于复杂文档的排版。
-
其他特定用途文件:
.htaccess
:用于配置 Web 服务器的文件。.gitignore
:Git 版本控制系统用来指定忽略的文件或文件夹。
这些文本文件在不同的领域和应用中扮演着重要的角色,从简单的信息记录到复杂的程序设计和系统配置。由于它们通常是以纯文本形式存储的,因此可以使用各种文本编辑器轻松查看和修改。
2 二进制文件
2.1 是如何存储的?
在计算机中,二进制文件的存储过程与文本文件类似,但二进制文件包含的是不限于文本字符的字节序列。这些文件通常包含用于特定应用的编码数据,如图像、音频、视频或可执行程序。以下是二进制文件存储的关键步骤和概念:
-
数据编码:
- 二进制文件将数据以二进制形式编码。这些数据可以代表任何内容,从图像的像素到音频的波形,或者是程序的机器码。
- 不同类型的二进制文件有不同的内部结构和编码方式。例如,图像文件(如 JPEG)将包含与图像格式相关的元数据和像素数据,而音频文件(如 MP3)将包含音频编码数据。
-
文件格式:
- 每种类型的二进制文件通常都遵循特定的格式或协议,定义了如何解释其中的数据。
- 文件格式既指定了数据的组织方式,也定义了必要的元数据,如文件头信息,它描述了文件的内容和结构。
-
文件系统:
- 二进制文件被存储在文件系统中,该系统管理存储设备(如硬盘、SSD)上的数据。
- 文件系统负责分配空间来存储文件的二进制数据,并跟踪文件的位置、大小、创建时间等元数据。
-
字节序列存储:
- 二进制文件的内容作为字节序列存储在存储介质上。这些字节可以表示任何形式的数据,不仅限于文本字符。
-
存储介质:
- 二进制文件的字节序列物理存储在各种类型的存储介质上,如硬盘、固态驱动器、USB 驱动器等。
- 存储介质使用磁性、电子或其他技术来持久化地存储数据。
-
访问和解释:
- 读取二进制文件时,必须使用理解特定文件格式的程序来正确解释文件内容。
- 例如,图像查看器能解释图像文件格式,音频播放器能解释音频文件格式。
总结来说,二进制文件在计算机中以字节序列的形式存储,这些序列代表各种类型的数据。每种二进制文件格式都有其特定的结构和编码方式,而正确的应用程序能够解析和处理这些文件中的数据。
2.2 分类
2.2.1 图像文件
二进制图像文件格式有许多种,各自有独特的数据组织方式,反映了它们的设计目的和使用场景。下面是一些常见图像格式的组织结构概述:
-
JPEG:
- 采用有损压缩技术。
- 文件开始于一个标记,指明文件类型(SOI)。
- 后跟一系列段(segments),包括量化表、霍夫曼编码表、帧数据(定义图像大小和颜色编码方式)和扫描数据(实际图像数据)。
- 支持不同程度的压缩,压缩更高会丢失更多细节。
-
PNG:
- 采用无损压缩技术。
- 文件以 8 字节的签名开始,用于检测文件类型。
- 主要由一系列块(chunks)组成,包括头块(定义图像的基本属性如宽度、高度、颜色深度)、数据块(图像数据)和结束块。
- 支持透明度和颜色管理。
-
GIF:
- 采用 LZW 无损压缩算法。
- 文件开始于一个逻辑屏幕描述符,包含全局颜色表和画布大小。
- 包含一个或多个图像块(每个都有自己的局部颜色表),以及可能的动画控制块。
- 每个图像块可以包含多帧,用于动画。
-
BMP:
- 文件头包含文件类型、大小和图像数据起始位置。
- 位图信息头定义图像的尺寸、颜色深度和压缩类型。
- 跟随的是颜色表和实际的像素数据。
- 文件通常较大,因为它们不使用压缩。
-
TIFF:
- 由多个带标签的图像文件目录(IFD)组成,每个目录定义一个图像。
- 每个 IFD 包含图像数据及其元数据的条目。
- 支持各种类型的压缩和多页图像。
-
RAW:
- 包含从摄像机传感器直接获取的未经处理的数据。
- 通常包括元数据,如曝光、白平衡设置。
- 文件结构取决于具体的摄像机制造商和型号。
-
WebP:
- 由 RIFF(Resource Interchange File Format)容器格式支持。
- 包含 WebP 数据块,该数据块包含实际的图像数据。
- 支持有损和无损压缩。
-
SVG:
- 基于 XML,文件包含用于描述图形的标记。
- 图形元素和属性以文本形式表示。
- 可以包含嵌入的光栅图像和用于互动性和动画的脚本。
-
HEIF:
- 基于 ISO 基础媒体文件格式(ISOBMFF)。
- 包括图像数据和元数据,支持图像序列(如实时照片)。
- 通常使用高效率视频编码(HEVC)压缩技术。
-
PSD:
- Adobe Photoshop 的专有格式。
- 包含图层、蒙版、透明度、文本、通道等多种数据类型。
- 支持复杂的图像编辑和保存未完成的工作状态。
这些格式的设计反映了它们的用途,从高效的网络传输(如 JPEG、WebP)到复杂的图像编辑(如 PSD、TIFF)不等。
2.2.2 音频文件
二进制音频文件格式多种多样,每种格式都有其特定的数据组织方式,这些方式反映了不同的设计目标,如音质保真度、文件大小和兼容性。以下是一些常见的二进制音频文件格式及其组织结构:
-
MP3 (MPEG Audio Layer III):
- 采用有损压缩,通过删除人耳难以察觉的音频部分来减小文件大小。
- 文件由一系列独立的帧组成,每帧包含音频数据和一个头部,头部包含帧的长度、位率和编码信息。
- 支持元数据标签,如 ID3,用于存储歌曲信息。
-
WAV (Waveform Audio File Format):
- 无损格式,通常用于存储未压缩的音频数据。
- 文件包含一个头部,定义音频格式、采样率、位深度和通道数。
- 后跟音频数据,直接表示声波的振幅。
-
AAC (Advanced Audio Coding):
- 与 MP3 类似,是一种有损压缩格式,但提供比 MP3 更高效的压缩和更好的音质。
- 用于 iTunes 和 Apple Music。
- 文件结构包括音频数据和可选的元数据。
-
FLAC (Free Lossless Audio Codec):
- 无损压缩,保留原始音频数据的完整性。
- 文件结构包括元数据块(如流信息、注释头部)和一系列音频帧,每个帧都包含音频数据和校验信息。
-
OGG Vorbis:
- 一种开源的有损压缩格式,旨在提供高效的流媒体。
- 文件由一系列位于 Ogg 容器中的 Vorbis 数据包组成,包括编码信息、音频数据和元数据。
-
ALAC (Apple Lossless Audio Codec):
- 由 Apple 开发的无损格式,用于 iTunes 和 Apple Music。
- 类似于 FLAC,但优化了与 Apple 设备和软件的兼容性。
-
AIFF (Audio Interchange File Format):
- 由 Apple 开发,通常用于存储未压缩的音频数据。
- 类似于 WAV,包含音频格式和音频数据块。
-
WMA (Windows Media Audio):
- 由微软开发的一系列音频编解码器和其对应的音频编码格式。
- 支持有损和无损压缩。
这些格式中,有损压缩格式(如 MP3、AAC、OGG Vorbis)在减小文件大小的同时牺牲了一定的音质,而无损格式(如 FLAC、ALAC、WAV)则保留了完整的音频质量,但文件大小相对较大。每种格式都有其特定的使用场景和优点。
2.2.3 视频文件
二进制视频文件格式涉及视频和音频的存储和编码,以及通常包含的元数据。这些格式为了满足不同的播放质量、文件大小和兼容性需求而设计。以下是一些常见的二进制视频文件格式及其组织方式:
-
MP4 (MPEG-4 Part 14):
- 用于存储数字视频和音频流,以及字幕和图像。
- 基于 ISO 基础媒体文件格式,包含多个轨道,每个轨道存储一种类型的数据(视频、音频、字幕等)。
- 支持多种编解码器,如 H.264(视频)和 AAC(音频)。
-
AVI (Audio Video Interleave):
- 由微软开发,同步存储音频和视频数据。
- 数据被分成块,每个块可以包含音频或视频数据。
- 支持多种不同的编解码器。
-
MOV (QuickTime File Format):
- 由苹果公司开发,类似于 MP4。
- 包含多个轨道,每个轨道用于存储不同类型的媒体数据。
- 常用于存储和分享高清视频。
-
WMV (Windows Media Video):
- 微软开发的一系列视频编解码器和其视频编码格式。
- 专为流媒体应用设计,强调压缩效率。
-
FLV (Flash Video):
- 用于通过互联网传输视频流。
- 常见于早期的在线视频共享网站,如 YouTube 初期。
- 包含视频和音频数据,支持 H.264 编码。
-
MKV (Matroska Video):
- 开源格式,能够容纳无限数量的视频、音频、图片或字幕轨道。
- 被用于存储多语言电影和电视节目。
-
WebM:
- 开源格式,专为网络使用设计。
- 支持高质量视频和低带宽要求。
- 基于 Matroska 容器,通常使用 VP8 或 VP9 视频编解码器和 Vorbis 或 Opus 音频编解码器。
-
H.264/AVC (Advanced Video Coding):
- 并非一个容器格式,而是一种视频编解码标准。
- 广泛用于各种格式,包括 MP4、AVI、MKV 等。
- 提供高效的视频压缩,被广泛用于网络和高清视频。
-
HEVC (High Efficiency Video Coding) 或 H.265:
- H.264 的继承者,提供更高效的视频压缩。
- 用于 4K 和更高分辨率的视频。
每种格式都包含一个或多个视频和音频流,可能还包括字幕和元数据(如标题、作者、时间戳等)。视频文件的复杂性来自于需要同时编解码视频和音频流,以及处理文件中的同步和元数据。不同的格式和编解码器平衡了压缩效率、质量、兼容性和专利许可等因素。
2.2.4 可执行文件
二进制可执行文件是一种特殊类型的二进制文件,包含能够被操作系统直接执行的机器码。这些文件是软件和程序的核心,因为它们让计算机能夠执行特定的命令和任务。以下是二进制可执行文件的一些关键特征和组织方式:
-
机器码:
- 可执行文件包含的机器码是直接由计算机的中央处理单元(CPU)执行的指令集。
- 这些指令是以二进制格式编写的,针对特定的硬件体系结构设计。
-
文件格式:
- 不同操作系统和平台有不同的可执行文件格式:
- 在 Windows 中,常见的可执行文件格式是
.exe
(可执行文件)和.dll
(动态链接库)。 - 在 Unix-like 系统(包括 Linux 和 macOS)中,可执行文件通常没有扩展名,但标记为可执行,并遵循 ELF(Executable and Linkable Format)或 Mach-O(macOS)格式。
- 在 Windows 中,常见的可执行文件格式是
- 不同操作系统和平台有不同的可执行文件格式:
-
组成部分:
- 可执行文件通常包含以下部分:
- 头部:包含文件的元数据,如类型、体系结构、入口点等。
- 文本段:包含程序的实际机器码指令。
- 数据段:包含静态变量和全局变量。
- 资源段(特别是在 Windows 中):包含程序的资源,如图标、UI 元素等。
- 可执行文件通常包含以下部分:
-
链接:
- 可执行文件通常由编译器从源代码编译而来,并通过链接器与其他库文件或模块链接在一起。
-
加载和执行:
- 当用户运行可执行文件时,操作系统的加载器会将文件加载到内存中,CPU 会开始执行文件中的机器指令。
-
依赖关系:
- 许多可执行文件依赖于特定的库文件或系统资源,这些依赖需要在文件执行时可用。
二进制可执行文件是软件发布的关键组成部分,它们使得开发的程序能够在目标计算机上运行。这些文件的具体格式和结构依赖于操作系统和硬件体系结构,因此通常不跨平台兼容。