0

16 進数の文字列 ("d43c23F1" など) を bash でバイナリに変換する方法。

ユーティリティ bc を使用しない場合。

16進数:バイナリ

d43c23F1:11010100001111000010001111110001

4

5 に答える 5

3

すべての 16 進数は、正確に 4 桁の 2 進数に対応します。これらのマッピングの辞書を作成し、すべての 16 進数文字をループ処理して、4 桁を回答に追加します。時間がないのでコードは投稿しませんが、ここから先に進むことができるはずです。

于 2012-05-21T16:50:45.437 に答える
3

代わりに使えますdcか?次に、次のことができます。

$ echo 16 i 2 o D43C23F1 p | dc
11010100001111000010001111110001

それ以外の場合は、bash の「連想配列」を使用して Emil の提案に従うことができます。それらについて詳しく説明しているLinux Journal の記事があります。16 進数を 2 進数表現にマップする辞書を作成します。

declare -A bits
bits[A]=1010

16 進文字列を数字に分割し、配列内でそれぞれを検索します。

于 2012-05-21T16:56:07.853 に答える
1

恥知らずに、ここから盗まれ、ヘックスの修正が加えられました。

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

これを機能させるには、16 進数を で始める必要があります0x

于 2012-05-21T17:20:15.847 に答える
0

このコードは、16進数が大文字であると想定しています(大文字と小文字を使用する可能性のある他のベースに必要)-関数を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
}
于 2012-05-22T14:30:18.660 に答える