【问题标题】:Hex to Binary conversion in bashbash中的十六进制到二进制转换
【发布时间】:2025-12-26 18:05:10
【问题描述】:

我正在尝试使用 bash 将一系列字节从十六进制转换为二进制。 但我不断收到(看似随机的)“(standard_in)1:语法错误”来自以下代码的回复:

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

有谁知道为什么它适用于十进制,但不适用于十六进制? 在我看来,语法几乎相同(除非我遗漏了一些非常难的东西。)

【问题讨论】:

标签: bash binary hex bc


【解决方案1】:

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

【讨论】:

  • 所以这确实是一个简单的错误。感谢您指出这一点,就像一个魅力。
  • 很高兴为您提供帮助,BC 是一个很棒的工具,有一些你必须知道的怪癖:-)
  • 有人知道如何将 bc 的输出填充到一定位数吗?在上面的示例中不需要这样做,但只需尝试使用 00 作为输入的循环。
  • 看看length 函数。 “长度函数的值是表达式中有效数字的个数。”
【解决方案2】:

这是我使用的脚本:

#!/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

【讨论】:

  • 注意事项:十六进制数字必须以0x 开头,HEX 列实际上列出了十进制值。但是感谢您为“如何……在 bash 中”问题提供纯 bash 解决方案!有时这实际上是人们正在寻找的。您不能总是依赖于 bc 等工具的存在。
  • 我使用的 bash 版本 (4.4.12) 不需要在十六进制数字前加前缀。该脚本无法正确处理0,但您想在最后一次echo 调用中将$Binary 替换为${Binary:-0}
【解决方案3】:

试试这个:

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

【讨论】:

  • 还有其他答案提供了 OP 的问题,它们是前段时间发布的。发布答案 see: How do I write a good answer? 时,请确保添加新的解决方案或更好的解释,尤其是在回答较老的问题时。
【解决方案4】:

我想出了这个:

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

使用 hexdump 转储以证明它有效...

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

【讨论】: