如何将bash中的十六进制字符串(例如“d43c23F1”)转换为二进制文件。
不使用实用程序bc。
六角:二进制
d43c23F1:11010100001111000010001111110001
答案 0 :(得分:3)
每个十六进制数字恰好对应于四位二进制数字。制作这些映射的字典并循环遍历每个十六进制字符,将四位数附加到答案。我没有发布代码,因为我没有那么多时间,但你应该可以从这里开始。
答案 1 :(得分:2)
您可以使用dc
吗?然后你可以这样做:
$ echo 16 i 2 o D43C23F1 p | dc
11010100001111000010001111110001
否则,您可以使用bash“关联数组”来遵循Emil的建议。有一个Linux Journal article会详细讨论它们。创建一个将十六进制数字映射到二进制表示的字典:
declare -A bits
bits[A]=1010
将十六进制字符串拆分成数字,然后在数组中查找每个字符串。
答案 2 :(得分:1)
无耻地从here被盗,并修改了十六进制。
#!/bin/bash
# SCRIPT: hex2binary.sh
# USAGE: hex2binary.sh Hex_Number(s)
# PURPOSE: Hex to Binary Conversion. Takes input as command line
# arguments.
# \\\\ ////
# \\ - - //
# @ @
# ---oOOo-( )-oOOo---
#
#####################################################################
# 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
启动十六进制数字才能生效。
答案 3 :(得分:1)
试试这个:
$ echo "ibase=16; obase=2; D43C23F1" | bc
答案 4 :(得分:0)
此代码假定您的十六进制是大写(对于可能使用大写和小写的其他基础所必需的) - 只需将函数添加到您的bashrc
toupper() { #change input $@ to upper case
uppers=ABCDEFGHIJKLMNOPQRSTUVWXYZ
lowers=abcdefghijklmnopqrstuvwxyz
i=0
while ([ $i -lt ${#1} ]) do
CUR=${1:$i:1}
case $lowers in
*$CUR*)CUR=${lowers%$CUR*};OUTPUT="${OUTPUT}${uppers:${#CUR}:1}";;
*)OUTPUT="${OUTPUT}$CUR";;
esac
i=$((i+1))
done
printf "${OUTPUT}"
}
baseN2dec(){ #usage: baseN2dec number <base> (default base is 16)
#note base32 and base64 should really have a different string pattern ... todo
#RFC 4648 Base32 alphabet ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 we use base32hex
#Base 64 is ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
STRING=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/
i=$((${#1}-1));DEC=0;POS=1;BASE=${2:-16}
while ([ $i -ge 0 ]) do
VAL=${1:$i:1}
VAL=${STRING%${VAL}*}
VAL=${#VAL}
DEC=$(($VAL*$POS+$DEC))
POS=$(($BASE*$POS))
i=$(($i-1))
done
echo $DEC
}
dec2baseN(){ #usage: dec2baseN number <base>
A=$(($1/$2))
STRING=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/
[ $A -ge $2 ] && dec2baseN ${A} $2 || printf ${STRING:$A:1}
printf ${STRING:$(($1%$2)):1}
}
dec2bin(){
dec2baseN $1 2
}
dec2hex(){
dec2baseN $1 16
}