当您使用“copy /b”命令时到底发生了什么?

Chi*_*ata 14 windows-7 command-line

今天,我刚刚发现我可以使用该copy /b命令合并某些文件。特别是,我注意到当我合并两个 mp3 文件时,VLC 播放器在时间上表现出有趣的行为:

             取 1

在这里,这很正常,但是第一首音乐即将结束……然后是有趣的部分……

            拿2              拿3

在这里,时间搜索实际上是在播放时在运行。

在将图片或 PDF 与此技术结合时,我发现文件大小会正确增加,但只会显示第一张图片。

所以我的问题是:该copy /b命令究竟做了什么?它真的是为了用于合并文件还是这是一个黑客?

Syn*_*ech 19

命令的/b标志copy将文件视为二进制文件(即,无意义字节的原始流),并逐字节复制它们,而不是/a将它们视为文本行(带有行尾)的默认(或)行为字符、文件结尾等)

您可以使用默认文本行为或二进制开关合并文本文件,但几乎任何二进制文件都不起作用。您不能简单地从两个二进制文件复制字节并期望它们工作,因为二进制文件通常具有标头元数据数据结构。等定义文件的格式。如果您进行二进制复制,您将简单地按原样复制所有字节,最终将这些结构放在它们不应该存在的位置,因此当您打开它们时,解析函数会遇到问题,并查看哪些本质上是损坏的数据. 有些程序会忽略那些没有意义的部分,只是简单地展示它们能做什么(这允许立体成像工作),但有些程序会抛出错误并抱怨文件已损坏。检测损坏的能力取决于文件类型。

例如,让我们发明一种简化的 PDF 格式:

Byte(s)    Meaning
---------------------

File header:
0-1        # of Pages
2-3        Language
4-5        Font
6-EOF      Data (each page encoded separately)

Page data:
0-1        Page number
2-3        # of characters on page
4-#chars   Letters contained on the page
Run Code Online (Sandbox Code Playgroud)

如您所见,每个文件都将包含一个带有一些一般信息的文件级标题,然后是包含页面数据的每个页面的数据块。如果您然后将两个文件,每个文件包含一页并将它们合并为二进制文件,您将不会创建一个两页的文件,而是一个以一页开头的损坏文件,然后有一堆垃圾(文件当程序尝试读取第二页时,标题没有意义)。

你的 MP3 也会发生同样的事情。当你像这样组合它们时,第二个文件开头和/或结尾的ID3 标签被保留,当播放器尝试读取下一帧时,它正在等待音频数据,但正在找到第二个文件与音频数据的预期格式不匹配,因此它不知道该怎么做。一些播放器将标题作为音频数据播放(可能会作为静态/噪音/流行音乐/等播放),一些播放器会切断声音直到下一个正确的帧,一些可能完全停止播放歌曲,有些甚至可能崩溃.

copy除了纯文本之外,该命令对文件类型一无所知(即使这样,也只知道 ASCII 文本),因此只有纯文本才能与其正确组合。必须使用知道如何正确解析和解释内容的编辑器来组合二进制文件。