Как записать целое число в двоичный файл, используя 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?
Ответы
Ответ 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