根据我的经验,如果我.jpg
使用扩展名保存文件.png
(反之亦然),大多数程序都会正常打开它。我想知道为什么会这样,并询问有视频编解码器经验的人,如果我尝试将mov
或avi
文件保存为会发生什么mp4
?(要完全清楚:我所说的保存是指用不对应的扩展名重命名它们的文件名)
如果文件扩展名是 MP4,支持 AVI 和 MOV 的视频播放器是否仍然能够播放该文件?
- 如果是的话,您能描述一下在尝试这样的播放时可能出现的所有问题吗?
- 如果不是,为什么?为什么图像也能做到这一点?描述您认为与此主题相关的所有技术细节!
谢谢 :)
答案1
大多数程序根本不看扩展名。它们查看文件头内容以确定它到底是什么并采取相应措施。
几乎每个众所周知的标准文件格式在文件的第一个字节中都有可识别的标识。(例如,每个 GIF 图像的前 6 个字节都是字符“GIF87a”。)
如果软件知道如何处理它,它就会处理(有些会发出扩展名错误的警告),如果不知道,它会给你一个错误消息(或者如果编程不当,它会崩溃)。
该扩展主要用作视觉指示器,向您指示最有可能的文件是什么。
它允许您的操作系统快速确定哪个应用程序最适合处理该文件,而无需实际读取文件的内容。
答案2
更改文件名称的作用就是:更改文件的名称。仅此而已。具体来说,更改文件名称不会更改文件的内容,只会更改名称,不会更改其他任何内容。
(事实上,改变文件的名称实际上不会改变文件根本,因为“名称”实际上只是目录中的一个条目。它与文件无关。)
由于文件本身的内容没有任何变化,因此,一个能够正确解码文件内容的程序在文件被命名时,Fred
也能够正确解码文件内容,这并不奇怪Wilma
,原因很简单,因为文件内容是一模一样。
答案3
几乎所有文件格式都在文件开头附近嵌入了有关文件类型的信息。例如,真正的 PNG 文件始终以八个字节开头0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A
(请注意,第 2 到第 4 个字节是 ASCII 字符“PNG”,其余的标头是二进制数据,旨在检测文件处理方式是否会导致数据损坏),或 ELF 对象文件(用于除 Windows 和 macOS 以外的大多数系统的可执行文件)以0x7F 0x45 0x4C 0x46
(第 2-4 个字节在 ASCII 中为“ELF”)开头。这些被称为文件签名,虽然它们不是根据内容确定文件类型的唯一方法,但它们通常是第一步。维基百科有一个许多常见文件类型的列表这可能会引起人们的兴趣。
文件签名几乎无处不在,这意味着您可以通过查看文件本身的内容来确定文件类型,几乎所有软件都是这样做的,原因有二:
- 它比匹配文件扩展名(或您从中下载文件的服务器报告的 MIME 类型)要可靠得多,因为您无法修改这些数据,而且仍然使其成为该类型的有效文件,但您可以将扩展名(或 MIME 类型)更改为您想要的任何内容,而文件的类型不会改变。
- 验证文件类型是防止应用程序崩溃或利用其中的错误的重要保护层。如果您盲目信任有关文件类型的其他信息来源,则可能会尝试将某些内容解析为一种类型的数据,而实际上它是另一种类型,这可能会导致各种问题。在预期的文件类型下,对文件结构的验证不足一直是恶意软件非常常见的攻击媒介。
Windows 在很大程度上是一个例外,因为它主要依靠文件扩展名而不是实际文件内容来决定告诉用户文件类型,而大多数其他系统和大多数应用程序只有在无法通过查看文件内容确定类型时才会使用文件扩展名。如今,文件扩展名的唯一实际用途是充当文件类型的通用指示器,使您可以更轻松地确定正在处理的文件类型或查找特定类型的文件,而无需检查文件内容,尽管在某些情况下,人们还是会选择检查内容(例如,请参阅file
UNIX 系统命令)。
答案4
我确信我曾在媒体播放器或 DVD 播放器上尝试过将同一个视频重命名为 2 到 3 个不同的扩展名,有些文件可以正常播放,有些则不行 - 完全相同的文件,只是扩展名不同
irfanview 会告诉我某个 jpg 是不是 gif 或反之亦然,并且会帮我重命名