当您使用“ copy / b”命令时,会发生什么?


13

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

             拿1

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

            拿2              拿3

在这里,时间搜寻实际上是在进行中。

通过这种技术将图片或PDF组合在一起时,我发现文件大小会适当增加,但只会显示第一张图片。

所以我的问题是:该copy /b命令的作用是什么?真的是要用于合并文件吗?或者这是黑客?

Answers:


17

该命令的/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

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

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

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


不错,VLC可以播放mp3文件,甚至可以正确查找,唯一的问题是您不只是想看到时间的变化...
Chibueze Opata 2012年

就像我说的那样,某些程序可以容忍损坏的文件。VLC的解析算法可以跳过“损坏的”帧,但是由于它们不是实际的帧,因此无法知道正确的长度,因此会跳来跳去。就像您加载上面发明的两页PDF文件一样;读者不会知道实际上有多少页。使用MP3的最佳选择是剥离标签,以便在进行二进制复制之前只有一堆音频帧。
Synetech

1

在您的示例中,对于MP3,由于MP3的编码方式,它可能会产生奇怪的行为。例如,ID3v1标签是MP3的最后128个字节(即艺术家,专辑等)。此信息不是“可播放的”。当VLC或其他媒体播放器打开MP3时,它将(可能)播放第一个MP3,对信息表现出滑稽的态度,然后可能播放文件的其余部分。我现在没有加载Windows,因此无法确定是否进行测试。

我认为这与图像和电影相同;取决于文件的编码方式取决于文件将如何“组合”。我想这个功能来自DOS时代,当时一切都是纯文本格式


1

很久以前,在我赢得Win ME的美好时光中,我只是用来连接视频剪辑。它不是一直都在工作,但有时会工作。

这是我使用的命令的示例:

copy /b movie1.mpg + movie2.mpg + movie3.mpg movie4.mpg

如果电影不是太大,并且所有类型,帧速率等都相同,那么它们通常会完美融合。最近没有尝试过类似的操作。


-1

对于MP3,大致来说,标头之后的内容都可以读取为数据。有这款游戏,《世嘉创世纪》中的《索尼克3》和另一款名为《索尼克与指节》的游戏。Sonic&Knuckles原始卡带上有一个插槽,用于插入其他游戏,但是当添加Sonic 2特别是3时,可能校验和会触发另一组指针,游戏的行为会有所不同。在使用ROM的早期阶段,每当我们要像硬件中那样放置两个盒带时就使用copy /b sonick.bin+sonic3.bin sonic3k.bin。这样,它们的合并将产生一个大的单个ROM,其中sonick将具有指令集(指针)以使其使用sonic3资源。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.