16進値があります。
B455
バイナリに変更すると
1011 0100 0101 0101
次の規則に従ってビットを交換したいと思います。
origin bits index : 0123456789ABCDEF
result bits index : D5679123C4EF80AB`
それでは結果が出ます。
1100 1011 0001 1101
16進数に変換する
CB1D
これを行うためのスクリプトシェルを入手するのに役立ちますか?
よろしくお願いします。
答え1
前述のように、エンクロージャはこれを行うのに最適な場所ではないかもしれません。本当にしたい場合は、、awk
およびdc
次printf
を使用する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
答え2
perl -wMstrict -le '
my @bits = unpack "(A1)16", sprintf "%016b", hex shift;
my $bitmap = "D5679123C4EF80AB";
@bits = @bits[ map { hex } split //, $bitmap ];
$"="";
print sprintf "%04X", oct "0b@bits";
' "B455"
Result: CB15
簡単に:
First we convert the input hex number into it's 16-bit binary equivalent and store the indi-
dual bits in the array @bits. The individual bits are now mapped according to the bitmap wh-
ich is generated by splitting into single bits and getting their decimal equivalents which
are the array indices of @bits. Last step involves in converting the mapped bits into their
4-digit hex counterpart.