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


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.