Barra invertida inesperada ao converter de hex para número binário

1

Estou tentando converter uma linha hexa em binário em bash , mas a saída inclui uma barra invertida. Alguém pode explicar por quê?

Entrada:

for i in 3D3D516343746D4D6D6C315669563362; do BIN=$(echo "ibase=16; obase=2; $i" | bc); echo $BIN; done

Saída:

11110100111101010100010110001101000011011101000110110101001101011011\ 0101101100001100010101011001101001010101100011001101100010

    
por In_Circ 13.10.2016 / 15:13

3 respostas

2

A implementação POSIX de bc divide as linhas de saída para um máximo de 70 caracteres, usando a barra invertida como um caractere de continuação de linha .

Se você tiver a versão GNU de bc , poderá substituir esse comportamento usando a variável de ambiente BC_LINE_LENGTH , por exemplo,

$ printf 'ibase=16; obase=2; %s\n' 3D3D516343746D4D6D6C315669563362 | BC_LINE_LENGTH=0 bc
111101001111010101000101100011010000110111010001101101010011010110110101101100001100010101011001101001010101100011001101100010

De info bc :

'BC_LINE_LENGTH'
     This should be an integer specifying the number of characters in an
     output line for numbers.  This includes the backslash and newline
     characters for long numbers.  As an extension, the value of zero
     disables the multi-line feature.  Any other value of this variable
     that is less than 3 sets the line length to 70.
    
por 13.10.2016 / 16:13
1

Você pode filtrar a saída usando alguns "bashisms": echo ${BIN//[$'\r\n\']}

exemplo:

for i in 3D3D516343746D4D6D6C315669563362; do BIN=$(echo "ibase=16; obase=2; $i" | bc); echo ${BIN//[$'\r\n\']};done

Você também pode usar a variável env BC_LINE_LENGTH , que o GNU bc usará para ajustar o comprimento da linha (0 é ilimitado).

exemplo:

for i in 3D3D516343746D4D6D6C315669563362; do BIN=$(echo "ibase=16; obase=2; $i" | BC_LINE_LENGTH=0 bc ); echo $BIN;done

    
por 13.10.2016 / 15:26
0

Se o GNU bc não estiver disponível, isso também funciona:

echo "ibase=16; obase=2; 3D3D516343746D4D6D6C315669563362" | \
    bc | tr -d '\\n' ; echo
111101001111010101000101100011010000110111010001101101010011010110110101101100001100010101011001101001010101100011001101100010

(Saída muito longa intencionalmente não embrulhada.)

    
por 13.10.2016 / 20:49