Подтвердить что ты не робот

Как записать целое число в двоичный файл, используя Bash?

Возможный дубликат:
с помощью bash: записать бит-представление целого в файл

Мне нужно записать размер файла в двоичный файл. Например:

$ stat -c %s in.txt 
68187

$ stat -c %s in.txt >> out.bin

Вместо того, чтобы записывать строку "68187" в out.bin, я хочу записать 4-байтное представление int 168187 в out.bin.

Как я могу преобразовать "68187" в 4 байта int?

4b9b3361

Ответ 1

Вот что я мог придумать:

int=65534
printf "0: %.8x" $int | xxd -r -g0 >>file

Теперь, в зависимости от конечности, вы можете поменять порядок байтов:

printf "0: %.8x" $int | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 >>file

Пример (декодирован, поэтому он отображается):

printf "0: %.8x" 65534 | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 | xxd
0000000: feff 0000                                ....

Это для unsigned int, если int подписан и значение отрицательное, вам нужно вычислить два дополнения. Простая математика.

Ответ 2

Вы можете использовать следующую функцию для преобразования числового значения VALUE в соответствующий символ:

chr() {
  printf \\$(printf '%03o' $1)
}

Вам нужно преобразовать байтовые значения индивидуально, друг за другом в правильном порядке (endianess) для используемой машины/архитектуры. Поэтому я предполагаю, что использование другого языка сценариев, поддерживающего двоичный вывод, будет лучше всего работать.

Ответ 3

Посмотрите, работает ли это для вас

perl -e "print pack('L',`stat -c %s in.txt`)">>out.bin 

Ответ 4

echo 'obase=2;'`stat -c %s in.txt` | bc > out.bin