16 進文字列をバイナリに変換しようとしています。私は使用しています:
echo "ibase=16; obase=2; $line" | BC_LINE_LENGTH=9999 bc
先頭のゼロを切り捨てています。つまり、16 進文字列が4F
の場合は に変換され1001111
、 の場合0F
は に変換され1111
ます。私はそれが必要であり01001111
、00001111
私に何ができる?
16 進文字列をバイナリに変換しようとしています。私は使用しています:
echo "ibase=16; obase=2; $line" | BC_LINE_LENGTH=9999 bc
先頭のゼロを切り捨てています。つまり、16 進文字列が4F
の場合は に変換され1001111
、 の場合0F
は に変換され1111
ます。私はそれが必要であり01001111
、00001111
私に何ができる?
からの出力bc
は正しいです。それは単にあなたが考えていたものではありません (しかし、それは の設計者が考えていたものですbc
)。16 進数を 10 進数に変換した場合4F
、それから 079 が得られるとは思わないでしょう? 出力ベースがバイナリの場合、先行ゼロを取得する必要があるのはなぜですか? 短い答え: すべきではないので、bc
それらを発行しません。
バイナリ出力を 8 ビットの倍数にする必要がある場合は、次のような他のツールを使用して、適切な数の先行ゼロを追加できますawk
。
awk '{ len = (8 - length % 8) % 8; printf "%.*s%s\n", len, "00000000", $0}'
awk
次のようにパイプできます。
echo "ibase=16; obase=2; $line" | BC_LINE_LENGTH=9999 bc | awk '{ printf "%08d\n", $0 }'
あなたはPythonでそれを行うことができます:
line=4F
python -c "print ''.join([bin(int(i, 16))[2:].zfill(4) for i in '$line'])"
結果:
'01001111'
seqとsedを使用して、パディングを支援できます。
function paddington(){
PADDLE=8; while read IN; do
seq -f '0' -s '' 1 $PADDLE | \
sed "s/0\{${#IN}\}\$/$IN/"
done
}
bc <<< "ibase=16; obase=2; 4F; 1E; 0F" | paddington
出力:
01001111
00011110
00001111
イライラするのは、bc は入力がゼロで埋められることを期待しているが、同様の出力オプションを提供していないことです。sed を使用した別の方法を次に示します。
sed 's_0_0000_g; s_1_0001_g; s_2_0010_g; s_3_0011_g;
s_4_0100_g; s_5_0101_g; s_6_0110_g; s_7_0111_g;
s_8_1000_g; s_9_1001_g; s_[aA]_1010_g; s_[bB]_1011_g;
s_[cC]_1100_g; s_[dD]_1101_g; s_[eE]_1110_g; s_[fF]_1111_g;'