16진수를 2진수로 변환할 때 예기치 않은 백슬래시가 발생합니다.

16진수를 2진수로 변환할 때 예기치 않은 백슬래시가 발생합니다.

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_LENGTHGNU 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

(의도적으로 너무 긴 출력을 래핑하지 않습니다.)

관련 정보