从输入文件执行 dd,排除每个块的最后 4 个字节

从输入文件执行 dd,排除每个块的最后 4 个字节

我有一个非常大的文件(准确地说是 999,952,379,904 字节),它是部分磁盘映像。在十六进制编辑器中查看它,我发现其结构如下:

  • 0-2073 字节偏移量包含创建文件的工具添加的一些标头信息。我可以忽略它们。

  • 2074 字节以后是 1048580 字节的块,包含 1048576 个数据,后跟 4 字节 CRC 值。

我正在寻找一种有效的方法,从 2074 字节的偏移量开始,并将 1048580 字节块(不包括 4 字节 CRC 值)复制到输入文件的末尾。看起来文件没有以完整的块结尾,所以我要么排除最后一个块,要么用零填充它。

dd 显然可以适应从偏移量开始,但是有没有办法在复制时排除每个块的最后 4 个字节?

答案1

您可能必须创建 bash 循环并跳过dd每个块所需的字节。

编写简单的 C 程序更容易。

$ cat> cvt.c
#包括 <unistd.h>
#include <string.h>

#定义 SKIPBYTES (2074)

#定义 BUFSIZE (1048580)
#定义 STRIPBYTES (4)

空主()
{
  char buf[BUFSIZE]; /* 用于保存要传输的一个数据块的缓冲区 */
  ssize_t计数=0;

  read(0,buf,SKIPBYTES); /* 读取要跳过的初始数据 */

  而(1)
    {
    memset( (void *)buf,0,BUFSIZE); /* 用零字节填充 */
    count=read(0,buf,BUFSIZE); /*可能读取一个完整的缓冲区*/
    如果 (计数>0)
      write(1,buf,BUFSIZE-STRIPBYTES); /* 写入几乎所有字节 */
    别的
      休息;
    };

}

按住并CTRL击打d一次。

$ gcc -o cvt cvt.c
$ chmod 755 cvt
$ ./cvt <largefile.raw >filtered-file.dd

注意,“fd”0 是 stdin,1 是 stdout,2 是 stderr
检查:
$ man read
$ man 2 write

相关内容