Bashでの作業中にリトルエンディアンからビッグエンディアンに変換する必要がある16進変数があります。私はこの概念に初めて触れ、約20分前にこれについて学んだので共有してください。
私のスクリプトは、素数、符号付き2の補数、8で除算するなど、いくつかの変更を適用して16進変数を決定します。
他のすべてよりも先にリトルエンディアンからビッグエンディアンへの変換を行う必要があります。 (2つのことを混同する可能性がありますが、以下の例で明確に説明できます。)
例:
16進値:0080変換:8000
16進値:9800変換:0098
16進値:1234変換済み:3412
これは常に4桁の数字なので、16桁の16進変数だと思います。
答え1
16ビット値のバイト順序を変更するには、2バイトを置き換える必要があります。これは、単語からバイトを分離して単語内の別のビット位置に移動し、再び単一の単語に結合するように分解することができます。
特定のビットを分離するには、バイナリを使用します。そして、&
.実際には、あるオペランドのビットはx & 0 = 0
他のオペランドのビットによって与えられた合計を持ちます。したがって、たとえば、下位4ビットを提供します。x & 1 = x
1
0xab & 0x0f = 0x0b
移動するにはShift<<
またはを使用してください>>
。たとえば0x0f << 4 = 0xf0
。
これらの値を結合するには、バイナリを使用してください。または、|
例えば0x30 | 0x07 = 0x37
。
結合されたバイト交換は次x
のとおりですy
。
l = x & 0x00ff # isolate low byte
h = x & 0xff00 # isolate high byte
y = (l << 8) | (h >> 8) # move and combine
これらの演算の演算子は多くのプログラミング言語で同じであり、Cから継承されます。これにはシェルが含まれますが、そこには算術拡張に式を入れる必要があるので$(( ... ))
。 (つまり、とにかくシェルでこのようなことをしたい場合は、おそらくこれを行うのに最適なツールではありません。)