簡単に:

簡単に:

16進値があります。

B455

バイナリに変更すると

1011 0100 0101 0101

次の規則に従ってビットを交換したいと思います。

origin bits index : 0123456789ABCDEF
result bits index : D5679123C4EF80AB`

それでは結果が出ます。

1100 1011 0001 1101

16進数に変換する

CB1D

これを行うためのスクリプトシェルを入手するのに役立ちますか?

よろしくお願いします。

ベストアンサー1

前述のように、エンクロージャはこれを行うのに最適な場所ではないかもしれません。本当にしたい場合は、、awkおよびdcprintfを使用するsedソリューションがありますtr

#!/bin/sh
# file: swap-bits

target_order='D5679123C4EF80AB'
indices() {
    printf '%s\n' "$1"         \
    | sed 's/./\0 1+p\n/g'     \
    | sed '1s/^/10o16i/'       \
    | dc                       \
    | sed 's/^/substr( $0, /'  \
    | sed 's/$/, 1 )/'         \
    | tr '\n' ' '
    echo
}

sed 's/^/2o16iF/'                                              \
| sed 's/$/p/'                                                 \
| dc                                                           \
| sed 's/....//'                                               \
| awk "{ print \"16o2i\" $(indices ${target_order}) \"pq\" }"  \
| dc                                                           \
| sed 's/^/0000/'                                              \
| sed 's/.*\(....\)$/\1/'

入力を確認しません。このtarget_order変数は、好みの16ビット配列に設定する必要があります。

この関数は、indicesこのような文字列を入力として使用し、入力をソートするために使用される一連のsubstr( $0, n, 1 )コマンドを出力します。awk

スクリプト本体は、最初にdc入力を16進数から2進数に変換するために使用されます。入力の前にFを付け、4つの1ビットを捨てて先行0ビットを保持します。結果が入力され、バイナリを16進数に変換するコマンドをawk印刷し、配列されたdc出力を印刷して終了するコマンドを印刷しますdc。これはもちろんの入力ですdc。最後に、もう一度sed使用して、出力に前にゼロがあることを確認します(該当する場合)。

以下のように入力がオンになり、stdin出力がオンになります。stdout

$ echo B455 | ./swap-bits
CB15

おすすめ記事