bash中的十六进制到二进制转换

bash中的十六进制到二进制转换,bash,binary,hex,bc,Bash,Binary,Hex,Bc,我正在尝试使用bash将一系列字节从十六进制转换为bin。 但我不断从以下代码中得到(看似随机的)“(标准_in)1:syntax error”回复: for j in c4 97 91 8c 85 87 c4 90 8c 8d 9a 83 81 do BIN=$(echo "obase=2; ibase=16; $j" | bc ) echo $BIN done 我对dec to bin做了类似的事情,效果非常好: for i in {0..120} do

我正在尝试使用bash将一系列字节从十六进制转换为bin。 但我不断从以下代码中得到(看似随机的)“(标准_in)1:syntax error”回复:

for j in c4 97 91 8c 85 87 c4 90 8c 8d 9a 83 81
do
        BIN=$(echo "obase=2; ibase=16; $j" | bc )
        echo $BIN
done
我对dec to bin做了类似的事情,效果非常好:

for i in {0..120}
do
        KEYBIN=$(echo "obase=2; ibase=10; $i" | bc)
        echo $KEYBIN
done
有人知道为什么它可以用十进制,但不能用十六进制吗?
在我看来,语法几乎是一样的(除非我遗漏了一些很难理解的东西。)

BC对十六进制值的大小写有点敏感,改为大写应该可以

for j in C4 97 91 8C 85 87 C4 90 8C 8D 9A 83 81
do
        BIN=$(echo "obase=2; ibase=16; $j" | bc )
        echo $BIN
done
输出:

11000100
10010111
10010001
10001100
10000101
10000111
11000100
10010000
10001100
10001101
10011010
10000011
10000001

以下是我使用的脚本:

#!/bin/bash
# SCRIPT:  hex2binary.sh
# USAGE:   hex2binary.sh Hex_Number(s)
# PURPOSE: Hex to Binary Conversion. Takes input as command line
#          arguments.
#####################################################################
#                      Script Starts Here                           #
#####################################################################

if [ $# -eq 0 ]
then
    echo "Argument(s) not supplied "
    echo "Usage: hex2binary.sh hex_number(s)"
else
    echo -e "\033[1mHEX                 \t\t BINARY\033[0m"

    while [ $# -ne 0 ]
    do
        DecNum=`printf "%d" $1`
        Binary=
        Number=$DecNum

        while [ $DecNum -ne 0 ]
        do
            Bit=$(expr $DecNum % 2)
            Binary=$Bit$Binary
            DecNum=$(expr $DecNum / 2)
        done

        echo -e "$Number              \t\t $Binary"
        shift
        # Shifts command line arguments one step.Now $1 holds second argument
        unset Binary
    done

fi
试试这个:

用于c4 97 91 8c 85 87 c4 90 8c 8d 9a 83 81中的j
做
BIN=$(echo“obase=2;ibase=16;${j^^^}”| bc)
回音$BIN
完成
我想到了这个:

printf转换为十六进制,xxd-r-p接受ascii十六进制流并使其成为实际的二进制

用hexdump转储以证明它有效

printf "%016x" 53687091200 | xxd -r -p | hexdump -C

所以这真的是一个简单的错误。感谢您指出这一点,它的工作方式很有魅力。很高兴能提供帮助,BC是一个很棒的工具,有一些怪癖,您只需知道:-)有人知道如何将BC的输出填充到一定数量的数字吗?在上面的示例中不需要这样做,只需尝试以00作为输入的循环即可。请查看
length
函数。“长度函数的值是表达式中的有效位数。”注意:十六进制数之前必须加上
0x
,十六进制列实际上列出了十进制值。但感谢您为“如何……在bash中”问题提供了一个纯bash解决方案!有时候,这正是人们想要的。您不能总是依赖于bc等工具的存在。我使用的bash版本(
4.4.12
)不需要在十六进制数字前加前缀。脚本无法正确处理
0
,但是,您希望在最后一次
echo
调用中用
${Binary:-0}
替换
$Binary
,可能重复提供OP问题的其他答案,并且这些答案是在一段时间前发布的。在发布答案时,请确保添加新的解决方案或更好的解释,尤其是在回答旧问题时。