我试图将32个字符长的十六进制字符串(例如:A41EB86E184207262C12F66E7C480577
)转换为二进制。我正在使用:
echo "ibase=16; obase=2; $line" | bc
但它包括一个不必要的\
介于两者之间,这不允许我对结果执行任何位操作。
我得到的一个示例输出是:
10100100000111101011100001101110000110000100001000000111001001100010\
110000010010111101100110111001111100010010000000010101110111
注意第一行末尾的\
。
我可以做些什么来避免它?
答案 0 :(得分:4)
如果你有足够现代的bc
,你可以将BC_LINE_LENGTH
设置为零以禁用包装:
pax> echo "ibase=16;
...> obase=2;
...> A41EB86E184207262C12F66E7C480577" | BC_LINE_LENGTH=0 bc
这会在一行输出你的号码。
1010010000011110101110000110111000011000010000100000011100100110001011000001...
我倾向于在我的.profile
(或.bashrc
,我不记得我的头脑中),因为我喜欢这是默认值:
export BC_LINE_LENGTH=0
从联系手册:
BC_LINE_LENGTH:这应该是一个整数,指定数字输出行中的字符数。这包括长数字的反斜杠和换行符。作为扩展,零值禁用多线功能。此变量的任何其他值小于3会将行长度设置为70。
如果您的bc
不支持“0表示禁用”扩展程序,您还可以将其设置为高得离谱:
export BC_LINE_LENGTH=9999
如果bc
被“挑战”,因为它根本不允许BC_LINE_LENGTH
,您可能需要恢复输出的后期处理,例如使用tr
摆脱换行符和反斜杠:
pax> echo "ibase=16;obase=2;A41EB86E184207262C12F66E7C480577" | bc | tr -d '\\\n'