16진수 라인을 바이너리로 변환하려고 하는데 bash
출력에 백슬래시가 포함되어 있습니다. 누군가 이유를 설명할 수 있나요?
입력하다:
for i in 3D3D516343746D4D6D6C315669563362; do BIN=$(echo "ibase=16; obase=2; $i" | bc); echo $BIN; done
산출:
11110100111101010100010110001101000011011101000110110101001101011011\ 0101101100001100010101011001101001010101100011001101100010
답변1
POSIX 구현은 bc
백슬래시를 사용하여 출력 행을 최대 70자로 분할합니다.줄 연속 문자.
GNU 버전이 있는 경우 bc
환경 변수를 사용하여 이 동작을 재정의할 수 있습니다 BC_LINE_LENGTH
.
$ printf 'ibase=16; obase=2; %s\n' 3D3D516343746D4D6D6C315669563362 | BC_LINE_LENGTH=0 bc
111101001111010101000101100011010000110111010001101101010011010110110101101100001100010101011001101001010101100011001101100010
에서 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.
답변2
일부 "bashism"을 사용하여 출력을 필터링할 수 있습니다.echo ${BIN//[$'\r\n\\']}
예:
for i in 3D3D516343746D4D6D6C315669563362; do BIN=$(echo "ibase=16; obase=2; $i" | bc); echo ${BIN//[$'\r\n\\']};done
BC_LINE_LENGTH
GNU bc가 줄 길이를 조정하는 데 사용할 env 변수를 사용할 수도 있습니다 (0은 무한대입니다).
예:
for i in 3D3D516343746D4D6D6C315669563362; do BIN=$(echo "ibase=16; obase=2; $i" | BC_LINE_LENGTH=0 bc ); echo $BIN;done
답변3
만약에암소 비슷한 일종의 영양 bc
사용할 수 없습니다. 다음에서도 작동합니다.
echo "ibase=16; obase=2; 3D3D516343746D4D6D6C315669563362" | \
bc | tr -d '\\\n' ; echo
111101001111010101000101100011010000110111010001101101010011010110110101101100001100010101011001101001010101100011001101100010
(의도적으로 너무 긴 출력을 래핑하지 않습니다.)