Как создать бинарный файл с определенным значением?

После удаления -fиз второй команды эти две команды должны быть эквивалентны (с GNUtar). Запись в -с использованием -fне задокументирована в руководстве GNU tar, но его infoруководство говорит:

If you use '-' as an ARCHIVE-NAME, 'tar' reads the archive from standard input (when listing or extracting files), or writes it to standard output (when creating an archive). If you use '-' as an ARCHIVE-NAME when modifying an archive, 'tar' reads the original archive from its standard input and writes the entire new archive to its standard output.

С -fво второй команде он будет записывать в файл с именем -Oи не будет выводить данные на свой стандартный вывод.

8
20.04.2021, 00:11
3 ответа

Вероятно, проще всего использовать trдля преобразования нулей из /dev/zeroво что угодно, а затем обрезать до нужной длины, используя ddили headили что-то подобное.

Это запишет 18520 байт со всеми битами единицами, поэтому значение 0xff или 255, или 377 в восьмеричном виде должно быть:

< /dev/zero tr '\000' '\377' | head -c 18520 > test.bin

(Для преобразования из шестнадцатеричного или десятичного числа в восьмеричное можно использовать printf "%o\n" 0xffили подобное.)


Для создания потоков длиннее -байтовых строк я бы использовал Perl:

perl -e '$a = "abcde" x 1024; print $a while 1' | head...

(Конечно, здесь тоже можно использовать "\xff"или "\377". Я использовал здесь оператор повторения x 1024в основном для того, чтобы избежать минимально малых операций записи. Его изменение может повлиять или не повлиять на производительность этого.)

16
28.04.2021, 22:51

Не используйтеdd bs=…:это ненадежно . Либо используйте ibs=1 obs=1, либо используйте менее подверженные ошибкам -инструменты. Большинство headреализаций могут считать байты:

</dev/zero head -c 18520

Если вы хотите, чтобы файл был заполнен одним байтом, отличным от нуля, измените значение байта с помощью tr. Для всех -бит -один:

</dev/zero head -c 18520 | tr '\0' '\377'
13
28.04.2021, 22:51

чтобы конкретно ответить на ваш вопрос, использование dd отлично работает с tr в канале

dd if=/dev/zero bs=18520 count=1 | tr '\000' '1' > test.bin

однако вам следует уточнить объем этого, чтобы один из них дал вам более актуальный ответ

2
28.04.2021, 22:51

Теги

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