Как получить только первые десять байт двоичного файла


80

Я пишу сценарий bash, который должен получить заголовок (первые 10 байтов) файла, а затем в другом разделе получить все, кроме первых 10 байтов. Это двоичные файлы, и в первых 10 байтах они, скорее всего, будут содержать \0символы "и \n". Похоже, что большинство утилит работают с файлами ASCII. Как лучше всего решить эту задачу?


1
Для тех, кому нужен шестнадцатеричный вывод, см. Этот ответ unix.stackexchange.com/a/10882/103618
— Алвин Кеслер

Ответы:


144

Чтобы получить первые 10 байтов, как уже отмечалось:

head -c 10

Чтобы получить все, кроме первых 10 байтов (по крайней мере, с GNU tail):

tail -c+11

3
Да. ddИдея мне понравилась, но эта опция не требует изменения размера буфера, поэтому она хорошо работает с огромными файлами. Благодарю.
— User1

42

head -c 10 делает здесь правильные вещи.


9
Интересно, что этот ответ был первым, он правильный, но у остальных гораздо больше голосов.
— Роберт

34

Вы можете использовать ddкоманду для копирования произвольного количества байтов из двоичного файла.

dd if=infile of=outfile1 bs=10 count=1
dd if=infile of=outfile2 bs=10 skip=1

1
Это работает, но довольно медленно. Значение BS 10 убивает эти огромные файлы. Есть ли более быстрый способ пропустить первые десять байтов? Это кажется таким простым.
— User1

dd не надежен. Он может читать меньше байтов, чем запрошено, по разным причинам.
— ceving

@ceving не могли бы вы упомянуть хотя бы одну из этих причин? Я не уверен, что верю тебе.
— Марк Рэнсом,

В следующем примере печатается 1 вместо 2:{ printf a; sleep 1; printf b; } | dd bs=2 count=1 2>/dev/null | wc -c
— ceving

Объяснение здесь и здесь
— ceving
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.