【发布时间】:2012-03-07 17:00:24
【问题描述】:
我正在寻找一些在 shell 脚本中将十六进制数转换为 0 和 1 字符序列的简单方法。
例子:
5F -> "01011111"
是否有任何命令或简单的方法来完成它或者我应该为它写一些开关?
【问题讨论】:
我正在寻找一些在 shell 脚本中将十六进制数转换为 0 和 1 字符序列的简单方法。
例子:
5F -> "01011111"
是否有任何命令或简单的方法来完成它或者我应该为它写一些开关?
【问题讨论】:
echo "ibase=16; obase=2; 5F" | bc
【讨论】:
5F,而选定的答案有5f。此答案在 bc 1.06.95 中有效,而所选答案无效。
我在 Linux 中使用了“bc”命令。 (比转换复杂得多的计算器!)
echo 'ibase=16;obase=2;5f' |公元前
ibase 参数是输入基数(在这种情况下是六进制),而 obase 是输出基数(二进制)。
希望对你有帮助。
【讨论】:
ibase 之前设置obase。如果首先定义ibase,bc 将尝试解释obase,就好像它是用ibase 编写的一样,可能会产生错误的结果。见this question。
bc 版本 1.06.95 echo 'ibase=16;obase=2;5f' | bc 会产生错误:(standard_in) 1: syntax error。但是,echo 'ibase=16;obase=2;5F' | bc 工作并产生 1011111。
$ printf '\x5F' | xxd -b | cut -d' ' -f2
01011111
或者
$ dc -e '16i2o5Fp'
1011111
i 命令将弹出堆栈顶部并将其用作输入基数。Hex 数字必须大写以避免与 dc 命令冲突,并且如果输入基数大于 16,则不限于 A-F。李>
o 命令对输出库执行相同的操作。p 命令将打印堆栈顶部并在其后添加换行符。【讨论】:
Perl 的printf 已经知道二进制:
$ perl -e 'printf "%08b\n", 0x5D'
01011101
【讨论】:
我为这类工作写了https://github.com/tehmoon/cryptocli。
这是一个例子:
echo -n 5f5f5f5f5f | cryptocli dd -decoders hex -encoders binary_string
产量:
0101111101011111010111110101111101011111
反之亦然。
注意:它并不完美,需要做很多工作,但它正在发挥作用。
【讨论】: