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

(意図的に長すぎる出力をラップしません。)

関連情報