Как я мог использовать Bash для нахождения 2 байтов в двоичном файле, увеличьте их значения и замену?

pdfimages является одной программой для извлечения изображений:

NAME
       pdfimages - Portable Document Format (PDF) image extractor (version 3.00)

SYNOPSIS
       pdfimages [options] PDF-file image-root

DESCRIPTION
       Pdfimages saves images from a Portable Document Format (PDF) file as Portable Pixmap (PPM), Portable Bitmap (PBM), or JPEG files.

       Pdfimages reads the PDF file PDF-file, scans one or more pages, and writes one PPM, PBM, or JPEG file for each image, image-root-
       nnn.xxx, where nnn is the image number and xxx is the image type (.ppm, .pbm, .jpg).


pdfimages --help
pdfimages version 0.12.4
Copyright 2005-2009 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2004 Glyph & Cog, LLC
Usage: pdfimages [options] <PDF-file> <image-root>
  -f <int>       : first page to convert
  -l <int>       : last page to convert
  -j             : write JPEG images as JPEG files
  -opw <string>  : owner password (for encrypted files)
  -upw <string>  : user password (for encrypted files)
  -q             : don't print any messages or errors
  -v             : print copyright and version info
  -h             : print usage information
  -help          : print usage information
  --help         : print usage information
  -?             : print usage information

pdftoppm - другой:

NAME
       pdftoppm - Portable Document Format (PDF) to Portable Pixmap (PPM) converter (version 3.00)

SYNOPSIS
       pdftoppm [options] PDF-file PPM-root

DESCRIPTION
       Pdftoppm  converts  Portable  Document  Format  (PDF) files to color image files in Portable Pixmap (PPM) format, grayscale image
       files in Portable Graymap (PGM) format, or monochrome image files in Portable Bitmap (PBM) format.

       Pdftoppm reads the PDF file, PDF-file, and writes one PPM file for each page, PPM-root-nnnnnn.ppm, where nnnnnn is the page  num‐
       ber.

Как уже упомянуто, можно попытаться открыть PDF с графическим программным обеспечением управления.

Как длятся нейтрализацию, можно отобразить PDF, сделать снимок экрана и работать над этим.

8
30.08.2013, 16:25
2 ответа

Тестирование с этим файлом:

$ echo hello world > test.txt
$ echo -n $'\x1b\x1f' >> test.txt
$ echo whatever >> test.txt
$ hexdump -C test.txt 
00000000  68 65 6c 6c 6f 20 77 6f  72 6c 64 0a 1b 1f 77 68  |hello world...wh|
00000010  61 74 65 76 65 72 0a                              |atever.|
$ grep -a -b --only-matching $'\x1b\x1f' test.txt 
12:

Так в этом случае 1B 1F в положении 12.

  • Преобразуйте в целое число (существует, вероятно, более легкий путь),

    $ echo 'ibase=16; '`xxd -u -ps -l 2 -s 12 test.txt`  | bc
    6943
    
  • И реверс:

    $ printf '%04X' 6943 | xxd -r -ps | hexdump -C
    00000000  1b 1f                                             |..|
    $ printf '%04X' 4242 | xxd -r -ps | hexdump -C
    00000000  10 92                                             |..|
    
  • И откладывание его в файле:

    $ printf '%04X' 4242 | xxd -r -ps | dd of=test.txt bs=1 count=2 seek=12 conv=notrunc
    2+0 records in
    2+0 records out
    2 bytes (2 B) copied, 5.0241e-05 s, 39.8 kB/s
    
  • Результат:

    $ hexdump -C test.txt
    00000000  68 65 6c 6c 6f 20 77 6f  72 6c 64 0a 10 92 77 68  |hello world...wh|
    00000010  61 74 65 76 65 72 0a                              |atever.|
    
5
27.01.2020, 20:12
  • 1
    Да, Это точно, что я искал.Спасибо. –  piotrekkr 30.08.2013, 16:11
  • 2
    @frostschutz: существует ошибка — отсутствие \x— в строке два из Вашего примера кода. Это должно быть echo -n $'\x1b\x1f' >> test.txt. –  erik 30.08.2013, 23:07
  • 3
    Преобразуйте в целое число (существует, вероятно, более легкий путь), Ах да, существует! :) erik выбрал лучшую команду, таким образом, я просто адаптирую его строку к Вашей: printf "%d" 0x1B1F сделает задание очень хорошо для получения Вашего 6943 результат; идя от этого, можно использовать значительно более умную строку как printf "%d" $(xxd -u -ps -l 2 -s 12 test.txt) вместо этого и Вам не будет нужно bc больше. –  syntaxerror 02.12.2014, 19:08

О, извините. Этот ответ является устаревшим, потому что я думал, что Вам записали шестнадцатеричные значения как ASCII в Вашем файле.


Можно преобразовать шестнадцатеричные числа в десятичную систему счисления через printf "%d" 0x1B1F.

Если Вы сохранили байты в переменной BYTES=1B1F затем Вы получаете результат с printf "%d" 0x$BYTES.

Так, если Вы хотите увеличить число, делают

$ echo $(($(printf "%d" 0x$BYTES) +1))
6944

Затем преобразуйте его назад

printf '%X' $(($(printf "%d" 0x$BYTES) +1))
1B20
2
27.01.2020, 20:12

Теги

Похожие вопросы