2

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

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

但它包括一个不必要\的中间,它不允许我对结果执行任何位操作。

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

10100100000111101011100001101110000110000100001000000111001001100010\
110000010010111101100110111001111100010010000000010101110111

注意\第一行末尾的 。

我能做些什么来避免它?

4

1 回答 1

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'
于 2012-09-28T03:28:32.090 回答