Linux shell脚本编程:十六进制数转二进制字符串

8

我希望您能提供一种在shell脚本中将十六进制数转换为0和1字符序列的简便方法。

例如:

5F -> "01011111"

有没有命令或者简单的方法可以完成它,还是我需要为此编写一些开关?
5个回答

12
echo "ibase=16; obase=2; 5F" | bc

谢谢,这与我选择的正确答案相同,我选择它是因为有解释。 - srnka
4
这不同于所选答案。这个里面有 5F,而所选答案是 5f。这个回答适用于 bc 1.06.95,而所选答案不适用。 - nrz

10

我在Linux中使用了'bc'命令。(比转换更复杂的计算器!)

echo 'ibase=16;obase=2;5f' | bc

其中ibase参数表示输入基数(这里是十六进制),而obase则表示输出基数(二进制)。

希望对您有所帮助。


3
在设置ibase之前设置obase。如果先定义了ibasebc将尝试将obase解释为它是用ibase编写的,可能会产生错误的结果。请参见此问题 - mcmlxxxvi
5
使用版本为1.06.95的bc,执行命令echo 'ibase=16;obase=2;5f' | bc会出现错误:(standard_in) 1: syntax error。然而,执行echo 'ibase=16;obase=2;5F' | bc命令可以正常运行,并输出结果1011111 - nrz

8
$ printf '\x5F' | xxd -b | cut -d' ' -f2
01011111

或者

$ dc -e '16i2o5Fp'
1011111
  • i 命令将弹出栈顶并将其用作输入基数。
  • Hex 数字必须大写,以避免与 dc 命令发生冲突,并且如果输入基数大于 16,则不限于 A-F
  • o 命令对输出基数执行相同的操作。
  • p 命令将打印堆栈顶部,并在其后添加换行符。

感谢您的回复,有这么多实现此任务的方法真是太棒了 :) 我选择了“bc”变量。 - srnka

2

Perl的printf已经可以处理二进制数了:

$ perl -e 'printf "%08b\n", 0x5D'
01011101

1
我为这种工作编写了 https://github.com/tehmoon/cryptocli
以下是一个示例:
echo -n 5f5f5f5f5f | cryptocli dd -decoders hex -encoders binary_string

产生:

0101111101011111010111110101111101011111

相反的情况也是成立的。

NB: 它并不完美,还有很多工作需要做,但它正在运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接