Binary Processing Tips(バイナリ処理テクニック)

2540 ワード

最近プロトコル分析(RTMP)をしていますが、プログラムではバイナリを処理することがよくあります.ネットで検索してみると、バイナリ処理のテクニックのまとめや説明が見つからず、自分でまとめてみました.
1、基礎
コンピュータは、基本的にはバイナリで伝達され、格納されます.このようなシーケンスに似ています.
0010 1100, 0001 1101
使用するときは、これらのバイナリを「有意義」なフォーマットに翻訳し、例えば英語のアルファベットに翻訳します.バイナリを表すときに直接0と1で表示すると、長すぎて表示しにくいです.プログラムでは、一般的にバイナリを10進数または16進数として表します.たとえば、上記のバイナリは、
44,29=>10進数
0 x 2 c,0 x 1 d=>16進法
なぜなら、私たちは通常、8ビット(bits)ごとに1バイト(byte)、すなわち1 byte=8 bitsと見なしているからです.バイトは、コンピュータ転送のストレージのサイズと境界、すなわち、通常、最小単位です.そのため、私たちはプログラムの中で通常8 bitsで処理して、保存して、バイナリを伝送します.
計算機では16進法と2進法が天然に適合しており、すなわち4個の2進法(4 bits)ごとにちょうど1個の16進法の数(0~F)に対応している.したがって、プログラム言語の多くは16進数の字面量を直接サポートしています.例えば、多くの言語でbyte(つまり2つの4 bits)を定義することができます.
buf[0] = 0x2c
各byteは8 bitsと言っていましたが、これは10進数で表すと0~255で、プログラミング言語ではこの範囲の数字を直接表すタイプはありませんので、C言語では大きさが一致するcharタイプを使いました.charタイプも8 bitsで表すからです.しかし、私たちは通常、一連のバイナリを処理するので、int(4 bytes)を単位サイズとしてバイナリを表すこともできます.このようにint値は4 bytesを表すことができます.
2,バイナリアルゴリズム
バイナリ処理の要件は、通常、次のとおりです.
1、特定の1つまたは複数のビットを取得します(これはプロトコル分析でよく使用されます).
2特定のビットまたはビットを生成
2、バイナリ符号化フォーマットは伝送と記憶に用いる
3,バイナリを特定のフォーマットに復号する
2.1特定のビットを取る(Mask+&+>>)
プログラムでマスク(Mask)を使用して特定のビットを取得します.たとえば、次のバイナリについてです.
0010 1100
左から3番目であれば、まず0010 0000というマスクを作成し、3番目以外は0にします.この場合、ビットとビットを組み合わせて具体的なビットを得ることができ、シフト演算と組み合わせて結果を得ることができます.
0010 1100

0010 0000 &

--------------------

0010 0000 >> 5  = 0000 0001


もし私たちが真ん中の4桁を取っても同じなら、先生はマスクになります:0011 1100、それから:
0010 1100

0011 1100 &

-------------



0010 1100 >> 2  = 0000 1011


2.2特定のビットを生成する(Mask+|+>>)
特定のビットを生成するのも似ていますが、&を|に変換するだけです.0と0または1の「またはアクション」は元の値に影響しないためです.例えば、次のバイナリを左から3~5で010にしたいと思います.
0010 1100
我々のアルゴリズムは2つのステップに分けられ,第1のステップは3~5の位置0を先にし,そのためにマスク11(00)111を生成し,&を用いて中間3~5の位置0を用いる.0をセットした後、マスク00(01 0)000と
0010 1100

1100 0111 &    =>     0  

-------------------

0000 0100       => 3~5   0

0001 0000 |     =>        

-------------------

0001 0100  =>00(01 0)100         


2.3バイナリエンコーディング
符号化と復号化について言及する以上、符号化と復号化の間で合意しなければならない.このプロトコルは通常、符号表と呼ばれる.符号化と復号化の過程で、復号化のためにコードテーブルを調べる必要があります.実は符号化は中マッピングであり、よく使われるマッピングは以下の通りである.
8bits => char(ASCII)
32bits, 4bytes => unsigned integer(uint)
たとえば、次のバイナリ符号化を行います.
0010 1100, 0101 1101, 0011 0001, 0110 1110
結果:
ASCII  => ,]1n

uint   => 744305006

2.4バイナリ復号
復号化と符号化の方式は類似しており、符号化の逆方向動作である.
3、プログラム操作例
追加する...