やること
ちょっとした通信プロトコルのようなものを作ろうとした時、通信の開始や終了を示すシグナルとなるデータを入れたくなります。
この役割をするデータ値は「フラグバイト」や「フレームデリミタ」というらしいです。
どんな値がメジャーかを調べてみたのでメモにしておきます。
メジャーな5つのフラグバイト!
ChatGPTにメジャーなものをピックアップしてもらいました。
強引にランクづけしてもらったので順位はあくまでご参考までです。
順位 | HEX | BIN | DEC |
---|---|---|---|
1 | 0x7E | 01111110 | 126 |
2 | 0xFF | 11111111 | 255 |
3 | 0x55 | 01010101 | 85 |
4 | 0x00 | 00000000 | 0 |
5 | 0xFE | 11111110 | 254 |
第1位 : 0x7E
HEX | BIN | DEC |
---|---|---|
0x7E | 01111110 | 126 |
ビットパターン「01111110」には他の通常のデータとの混同を避けやすいという合理性があり、また、ビットの並びが特異であるため、フレームの開始や終了を明確に識別しやすいとのことです。
素朴な疑問としてデータ本体の中身に0x7Eが現れたらどう区別するのかという問題がありますが、たとえばPPPでは0x7D(二進数で 01111101)というエスケープバイトで処理されています。0x7Eと0x7Dがデータとして送信される必要がある場合、それぞれ0x7D-0x5Eと 0x7D-0x5D(0x20をXORした値)に置き換えて送信し、受信後にデコードすればOKというわけです。この方式を「バイトスタッフィング」と言うそうです。
用途:HDLC、PPPなどでフレームの開始と終了を示すなど。
第2位 : 0xFF
HEX | BIN | DEC |
---|---|---|
0xFF | 11111111 | 255 |
全てのビットが1であるため、非常に識別しやすく、他のデータとの混同が少なく理想的とのことです。
EEPROMやフラッシュメモリなどでメモリやレジスタを初期化する際に0xFFで埋めるシステムが多く、未使用またはリセット状態を示す値としても有効です。
ファームウェアやデバイスドライバなどの低層のプログラムでは、エラーや異常な状態を示すフラグとして使用されることもあるそうです。
用途:JPEGのセグメントマーカー、I2Cでのバスフリー状態など。
第3位 : 0x55
HEX | BIN | DEC |
---|---|---|
0x55 | 01010101 | 85 |
ビットパターン「01010101」は非常に規則的で、交互のパターンがデータ同期の際に役立ち、データストリームのビットクロックを正確に同期させるのに有効とのことです。
規則的なビットパターンは伝送エラーやデータの損傷が発生した場合にその異常を検出しやすく、特に連続したデータストリームで異常がないかを監視するのに適しています。
このパターンをプリアンブル(前置符号)として使用することで、受信機が受信データの開始点を正確に捉え、データのフレーミングエラーを減少させることができます。
フレーム同期や通信テストでも活用されるパターンとのことです。
用途:Ethernetなどで使われるプリアンブルなど。特にネットワーク機器での利用が多い。
第4位 : 0x00
HEX | BIN | DEC |
---|---|---|
5 | 0x00 | 00000000 |
ビットパターン「00000000」は、「ヌルバイト」または「ヌルキャラクター」として知られており、多くのプロトコルとシステムにおいて基本的ながら非常に重要な役割を果たすバイトだそうです。
C言語をはじめとする多くのプログラミング言語で、0x00は文字列の終端を示すために使用されます。これにより、プログラムは文字列の終わりを識別し、メモリを超えて読み込むことなく適切に処理を行うことができます。
データパディングやメモリ初期化にも使われることが多いです。
0x00がデータ本体内で現れないようにするテクニックとして、COBSによるエンコード送信などがあります。
第5位 : 0xFE
HEX | BIN | DEC |
---|---|---|
0x00 | 11111110 | 254 |
ビットパターン「11111110」は通信プロトコルにおいて主にデータ通信でのフレーム終端、エラーチェック、または特殊な制御信号として使用されるそうです。
特にシリアル通信では0xFEをフレームの終端を示すマーカーとして使用することがあり、これにより、受信機はデータフレームの終わりを認識し、正確にフレームを区切ることができます。
また、データの完整性を確認するためのエラーチェックにも使用されます。たとえば、データパケットが正しく終了したかどうかを示すために、パケットの最後に0xFEを配置することがあります。
いくつかのプロトコルでは、0xFEを特殊な制御信号やコマンドの開始を示すために使うことがあります。通信中に特定の操作を実行するためのトリガーとなります。
用途:RS-485通信のフレーム終端や特別な制御フレームのマーカーやModbus RTUのデータフレーム終端として。
その他
0x81:HDLC (High-level Data Link Control): HDLCで使用。
0x3C:HTML/XML:マークアップ言語でタグを開始するために使用。
0x1B:ANSIエスケープシーケンス:ターミナルやコンソールでの画面制御など
いろいろ違っていたらすみません。ご指摘ください。