У меня есть очень большой файл (999,952,379,904 байт, если быть точным), который является частичным образом диска. Глядя на это в шестнадцатеричном редакторе, я обнаружил, что структура выглядит следующим образом:

  • Смещение байта 0-2073 содержит некоторую информацию заголовка, добавленную инструментом, который создал файл. Я могу игнорировать их.

  • 2074 байта вперед - это блоки по 1048580 байтов, содержащие 1048576 данных, за которыми следует 4-байтовое значение CRC.

Я ищу эффективный способ начать со смещения 2074 байта и скопировать 1048580 байтовых блоков, исключая 4-байтовые значения CRC, до конца входного файла. Похоже, что файл не заканчивается полным блоком, поэтому я бы либо исключил последний блок, либо добавил его нулями.

dd может четко приспособиться, начиная со смещения, но есть ли способ исключить последние 4 байта в каждом блоке при копировании?

1 ответ1

1

Вы, вероятно , придется создать цикл Баш и dd пропускать необходимые байты для каждого блока.

Написание простой программы на C проще.

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

#define SKIPBYTES (2074)

#define BUFSIZE (1048580)
#define STRIPBYTES (4)

void main()
{
  char buf[BUFSIZE];                /* buffer to hold one block of data to tranfser */
  ssize_t count=0;

  read(0,buf,SKIPBYTES);            /* read initial data to skip */

  while (1)
    {
    memset( (void *)buf,0,BUFSIZE); /* fill with zero-bytes */
    count=read(0,buf,BUFSIZE);         /* possibly read a full buffer */
    if (count>0)
      write(1,buf,BUFSIZE-STRIPBYTES); /* write almost all bytes */
    else
      break;
    };

}

Нажмите и удерживайте CTRL и нажмите d один раз.

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

Обратите внимание, "fd" 0 - это стандартный ввод, 1 - стандартный вывод, 2 - стандартный вывод.
Проверьте:
$ man read
$ man 2 write

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .