до н.э выходной двоичный файл как откусывание, разделенное пробелом

попытайтесь добавить (require 'iso-transl) в Вашем .emacs файл.
См. также:

3
02.01.2015, 00:40
8 ответов

Я бы использовал эту простую функцию:

nibbles () { echo "obase=2; $1" | bc | rev | while read -n4 a; do echo -n "$a ";done | rev ; echo; }

$ nibbles 598980975283696640
1000 0101 0000 0000 0010 0000 0110 0000 0011 0000 0000 0111 0100 0000 0000 
2
27.01.2020, 21:10
echo 'obase=2;262148' | bc |
   perl -E 'say readline 
                =~ s/((....)*)\n/ $1/r 
                =~ s/(\d{4})/$1 /gr'
0
27.01.2020, 21:10

Позволяют до н.э и , sed делает разделение на откусывание для вас и использование до н.э и printf, чтобы сделать преобразование в набор из двух предметов с 4 цифрами с 0 подкладками:

i=598980975283696640
echo "obase=16;$i" | bc | sed 's/./&\n/g' | \
  xargs -I {} sh -c 'echo "ibase=16;obase=2;{}" | bc' | \
  xargs printf "%04d "
echo

1000 0101 0000 0000 0010 0000 0110 0000 0011 0000 0000 0111 0100 0000 0000
0
27.01.2020, 21:10
echo 'obase=2;598123123980975281233696640' | BC_LINE_LENGTH=0 bc |
  rev | fold -w4 | paste -sd ' ' - | rev

или:

echo 'obase=2;598123123980975281233696640' | BC_LINE_LENGTH=0 bc | sed ':1
  s/\(.*[01]\)\([01]\{4\}\)/\1 \2/;t1'

BC_LINE_LENGENGE = 0 - это остановить BC от упаковочных чисел в 70 столбцов. Это означает, что ГНУ, хотя. Rev не является стандартной командой, но довольно распространена.

7
27.01.2020, 21:10

Как альтернатива, вы можете использовать интерактивную оболочку Python для него. Например:

$ python
>>> s = bin(598980975283696640)[2:]; s = '0'*(4-len(s)%4)*(len(s)%4>0)+s
>>> [s[i:i+4] for i in range(0, len(s), 4)]
['1000', '0101', '0000', '0000', '0010', '0000', '0110', '0000',
 '0011', '0000', '0000', '0111', '0100', '0000', '0000']
>>> s = bin(5989809752836966)[2:]; s = '0'*(4-len(s)%4)*(len(s)%4>0)+s
>>> [s[i:i+4] for i in range(0, len(s), 4)]
['0001', '0101', '0100', '0111', '1011', '0011', '0100', '0010',
 '1001', '0111', '0000', '1011', '0110', '0110']

или только для одного выстрела:

$ python -c 's = bin(598980975283696640)[2:]; s = '0'*(4-len(s)%4)*(len(s)%4>0)+s; print [s[i:i+4] for i in range(0, len(s), 4)]' 
['1000', '0101', '0000', '0000', '0010', '0000', '0110', '0000', '0011', '0000', '0000', '0111', '0100', '0000', '0000']
0
27.01.2020, 21:10

Мой предпочтительный путь будет прокладывать его на умножение четырех:

echo 'obase=2;262148'| bc | perl -pe 'chomp; $_ = 0 x ((-length) % 4) . $_;s/([01]{4})/ $1/g;s/$/\n/'
0
27.01.2020, 21:10

Вы можете применить (GNU) cut к выходу bc, используя пользовательский разделитель выходов:

$ echo 'obase=2;5989809752836966' | BC_LINE_LENGTH=0 bc | rev \
  | cut --output-delimiter=' ' \
     -c$(echo -n 1-4; for i in $(seq 5 4 100); do echo -n ,$i-$((i+3)); done ) \ 
  | rev
1 0101 0100 0111 1011 0011 0100 0010 1001 0111 0000 1011 0110 0110

В конструкции СПИСКА cut, поставляемого через -c, используется тот факт, что неиспользуемые части этих списков не сообщаются как ошибка.

Версия dc:

$ echo '5989809752836966 2 o p' | DC_LINE_LENGTH=0 dc | rev \
  | cut --output-delimiter=' ' \
     -c$(echo -n 1-4; for i in $(seq 5 4 100); do echo -n ,$i-$((i+3)); done ) \
  | rev  
1 0101 0100 0111 1011 0011 0100 0010 1001 0111 0000 1011 0110 0110
0
27.01.2020, 21:10

с GNU awk :

awk '{while(length%4)$0=0$0;$1=$1}1' FPAT=....

вход

100001010000000000100000011000000011000000000111010000000000
1000000000000000100

Вывод

1000 0101 0000 0000 0010 0000 0110 0000 0011 0000 0000 0111 0100 0000 0000
0100 0000 0000 0000 0100
1
27.01.2020, 21:10

Теги

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