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

Как я могу создать двоичный файл с последующими двоичными значениями в bash?

нравится:

$ hexdump testfile
0000000 0100 0302 0504 0706 0908 0b0a 0d0c 0f0e
0000010 1110 1312 1514 1716 1918 1b1a 1d1c 1f1e
0000020 2120 2322 2524 2726 2928 2b2a 2d2c 2f2e
0000030 ....

In C, I do:

fd = open("testfile", O_RDWR | O_CREAT);
for (i=0; i< CONTENT_SIZE; i++)
{
    testBufOut[i] = i;
}

num_bytes_written = write(fd, testBufOut, CONTENT_SIZE);
close (fd);

это то, что я хотел:

#! /bin/bash
i=0
while [ $i -lt 256 ]; do
    h=$(printf "%.2X\n" $i)
    echo "$h"| xxd -r -p
    i=$((i-1))
done

person mustafa    schedule 15.12.2011    source источник
comment
Даже если вы, вероятно, упростили свой пример, чтобы сделать его короче: этот код не проверяет наличие ошибок И НЕ ИСПОЛЬЗУЕТ write(2), потому что совершенно нормально не только сбой, но и частичная запись. Вместо этого используйте fwrite(3) или аналогичный   -  person Jo So    schedule 15.12.2011


Ответы (4)


Есть только 1 байт, который вы не можете передать в качестве аргумента в командной строке bash: 0 Для любого другого значения вы можете просто перенаправить его. Это безопасно.

echo -n $'\x01' > binary.dat
echo -n $'\x02' >> binary.dat
...

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

dd if=/dev/zero of=binary.dat bs=1c count=1 

Чтобы добавить его в файл, используйте

dd if=/dev/zero oflag=append conv=notrunc of=binary.dat bs=1c count=1
person zhaorufei    schedule 12.01.2012
comment
Просто dd if=/dev/zero bs=1 count=1 без of и oflag выводит NUL байта на стандартный вывод. Так что вы можете сделать > или >>. - person glglgl; 12.01.2012

Возможно, вы могли бы взглянуть на xxd:

xxd: создает шестнадцатеричный дамп заданного файла или стандартного ввода. Он также может преобразовать шестнадцатеричный дамп обратно в исходную двоичную форму.

person Cédric Julien    schedule 15.12.2011
comment
Для тех, кто хочет знать, как использовать xxd для записи без необходимости отходить и искать его (как мне пришлось): echo "0000400: 4142 4344" | xxd -r - data.bin, где 0000400 — смещение в байтах в файле, а шестнадцатеричные байты с 41 по 44 — это то, что написано (встроенный пробел игнорируется). В этом примере строка «ABCD» размером 1024 байта записывается в файл «data.bin». - person starfry; 17.07.2015

Если вы не возражаете против использования существующей команды и хотите описать свои данные в текстовом файле, вы можете использовать binmake — это программа на C++, которую можно скомпилировать и использовать следующим образом:

Сначала получите и скомпилируйте binmake (бинарный файл будет в bin/):

$ git clone https://github.com/dadadel/binmake
$ cd binmake
$ make

Создайте текстовый файл file.txt:

big-endian
00010203
04050607
# separated bytes not concerned by endianess
08 09 0a 0b 0c 0d 0e 0f

Создайте свой двоичный файл file.bin:

$ ./binmake file.txt file.bin
$ hexdump file.bin
0000000 0100 0302 0504 0706 0908 0b0a 0d0c 0f0e               
0000008

Примечание: вы также можете использовать его с stdin/stdout

person daouzli    schedule 17.06.2016
comment
Если вы пойдете по этому пути, вам, вероятно, следует просто использовать стандартный инструмент (od для переносимости или xxd для удобства использования). - person nabin-info; 27.05.2017

используйте команду ниже,

i=0; while [ $i -lt 256 ]; do echo -en '\x'$(printf "%0x" $i)''  >> binary.dat; i=$((i+1));  done
person Prashant Adlinge    schedule 15.11.2018