C ++エスケープ文字-迷惑なプロトコルヘッダーを解決し、16進数の問題を終了

定義

エスケープ文字は、C言語の特殊な形式の文字です。通常、エスケープ文字は、印刷不可能な制御文字と、ASCII文字セットの特定の機能を持つ文字を表すために使用されます。

一般的なエスケープ文字と対応するASCIIコード
\ a ベル(BEL)
\ b バックスペース(BS)
\ f フォームフィード(FF)
\ n 改行(LF)
\ r キャリッジリターン(CR)
\ t 水平タブ(HT)
\ v 垂直タブ(VT)
\\ バックスラッシュ\
\ 0 ヌル文字(NULL)、文字列の終わりとしてよく使用されます
\ ddd 最大8桁の任意の文字
\ xhh 最大2桁の16進数字

アプリケーションシナリオ

  • ネットワークプロトコル

ネットワークプロトコルには、フレームヘッダーとフレームテールがあります。これらは、パケットスティックの現象を解決するための完全なフレームを定義するために使用されます。

たとえば、次の単純なプロトコル形式:

開始コード データ長 データ内容 チェックコード 終了コード
0xCD 0xCD 0x00 0x3D (ストリング) 0xED 0x70 0x3A 0x4D

完全なデータフレームをネットワークに送信する場合は、最初に適切なデータコンテンツが必要です。次に、データコンテンツをカプセル化し、開始コードと終了コードを追加し、データ長を計算し、コードをチェックします。フレームフォーマットのみがプロトコルで指定されたフォーマットを満たしています。送信のみを許可します。

しかし、多くの場合、フレームに開始コードと終了コードを追加する(すべてのデータを文字列の形式で格納する)のは簡単ではないことがわかります。16進数を文字列に簡単に変換する方法は?いくつかの方法があります。

  1. 各バイトの16進数が文字タイプに順次変換され、フレーム文字列の対応するインデックス位置に1つずつ割り当てられます。
  2. 16進数全体を文字列形式に直接変換し、それをフレーム文字列に追加します。

方法1の場合、次のように実装できます。

//存储完整一帧数据
char data[256];
//定义char变量,并以16进制数为其赋值
//添加起始码
char c = 0xCD;
data[0] = c;
data[1] = c;
//添加结束码
c = 0x3A;
data[254] = c;
c = 0x4D;
data[255] = c;

各桁の割り当てには2行のコードが必要であることがわかります。これは、特にそのような数が多い場合、かなり面倒です。

方法2の実装を見てみましょう。

//存储完整一帧数据
char data[256];
//定义char *变量,并以字符串为其赋值
//添加起始码
char *str = "\xCD\xCD";    //注意转义字符的使用,\xhh表示十六进制数字
strcpy(data, str);
//添加结束码
str = "\x3A\x4D";
strcpy(data+254, str);

比較すると、方法2は方法1よりも簡潔で読みやすく、理解しやすいことがわかります。

変換する数値が多い場合は、方法2を使用すると変換効率が大幅に向上します。

おすすめ

転載: blog.csdn.net/gkzscs/article/details/83658760