bash中的十六进制到二进制转换
我正在尝试使用bash将一系列字节从十六进制转换为bin。 但我不断从以下代码中得到(看似随机的)“(标准_in)1:syntax error”回复: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
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问题的其他答案,并且这些答案是在一段时间前发布的。在发布答案时,请确保添加新的解决方案或更好的解释,尤其是在回答旧问题时。