I'm trying to convert a 32 character long hex string (eg: A41EB86E184207262C12F66E7C480577) to binary. I'm using:

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

but its including an unnecessary \ in-between which is not letting me perform any bit operations on the result.

An example output that I got is:

10100100000111101011100001101110000110000100001000000111001001100010\
110000010010111101100110111001111100010010000000010101110111

Notice the \ in the end of the first line.

What can I do to avoid it?

有帮助吗?

解决方案

If you have a modern enough bc, you can set BC_LINE_LENGTH to zero to disable wrapping:

pax> echo "ibase=16;
...>       obase=2;
...>       A41EB86E184207262C12F66E7C480577" | BC_LINE_LENGTH=0 bc

This output your number on a single line.

1010010000011110101110000110111000011000010000100000011100100110001011000001...

I tend to have that in my .profile (or .bashrc, I can't remember off the top of my head) since I like that to be the default:

export BC_LINE_LENGTH=0

From the manpage:

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.

If your bc doesn't support the "0 means disable" extension, you can also set it ridiculously high:

export BC_LINE_LENGTH=9999

If your bc is "challenged" in that it doesn't allow BC_LINE_LENGTH at all, you may need to revert to post-processing of the output, such as using tr to get rid of newlines and backslashes:

pax> echo "ibase=16;obase=2;A41EB86E184207262C12F66E7C480577" | bc | tr -d '\\\n'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top