bc中的大型十六进制到二进制转换

时间:2012-09-28 03:26:32

标签: bash bc

我试图将32个字符长的十六进制字符串(例如:A41EB86E184207262C12F66E7C480577)转换为二进制。我正在使用:

echo "ibase=16; obase=2; $line" | bc

但它包括一个不必要的\介于两者之间,这不允许我对结果执行任何位操作。

我得到的一个示例输出是:

10100100000111101011100001101110000110000100001000000111001001100010\
110000010010111101100110111001111100010010000000010101110111

注意第一行末尾的\

我可以做些什么来避免它?

1 个答案:

答案 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'