通信プロトコルにおけるマルチバイトデータの解析
1774 ワード
カスタム通信プロトコルでは、バイトストリーム形式の場合.マルチバイトデータの解析に特に注意します.ここでは整形データを例に説明します.
例えば、通信プロトコルでは、データフレーム全体の長さを整形し、2バイトを占有することが規定されている.
データフレーム長257がバイト配列に変換されると、byte[0]=2、byte[1]=1となり、データ送信時にバイトbyte[0]を先に送信し、バイトbyte[1]を送信する
サービス側解析の場合、計算されたデータの正しい方法はbyte[0]+byte[1]*256=258であり、誤ったものはbyte[0]*256+byte[1]=513である
逆にクライアントがbyte[1]を先に送信し、byte[0]を送信すると、サービス側解析式の正しい方法はbyte[0]*256+byte[1]=258であり、エラーはbyte[0]+byte[1]*256=513である
これらの詳細が厳密に規定されていないと、解析エラーが発生します.
これらはすべて注意しなければならない細部で、些細なことですが、注意しないと解析に失敗します.
したがって、バイトストリーム通信プロトコル双方は、通信プロトコルに厳格に従ってデータを処理しなければならない.通信プロトコルは、各バイトの意味と、マルチバイトデータの格納順序を規定する必要があります.そうしないと、解析エラーが発生します.
いくつかの一般的な数値変換バイト配列の関数:
例えば、通信プロトコルでは、データフレーム全体の長さを整形し、2バイトを占有することが規定されている.
データフレーム長257がバイト配列に変換されると、byte[0]=2、byte[1]=1となり、データ送信時にバイトbyte[0]を先に送信し、バイトbyte[1]を送信する
サービス側解析の場合、計算されたデータの正しい方法はbyte[0]+byte[1]*256=258であり、誤ったものはbyte[0]*256+byte[1]=513である
逆にクライアントがbyte[1]を先に送信し、byte[0]を送信すると、サービス側解析式の正しい方法はbyte[0]*256+byte[1]=258であり、エラーはbyte[0]+byte[1]*256=513である
これらの詳細が厳密に規定されていないと、解析エラーが発生します.
これらはすべて注意しなければならない細部で、些細なことですが、注意しないと解析に失敗します.
したがって、バイトストリーム通信プロトコル双方は、通信プロトコルに厳格に従ってデータを処理しなければならない.通信プロトコルは、各バイトの意味と、マルチバイトデータの格納順序を規定する必要があります.そうしないと、解析エラーが発生します.
いくつかの一般的な数値変換バイト配列の関数:
/// <summary>
/// ,
/// </summary>
/// <param name="x"></param>
/// <param name="length"></param>
/// <returns></returns>
static byte[] IntToBytes(int x, int length)
{
byte[] b = new byte[length];
int temp = x;
for (int i = 0; i <= length - 1 && i < 4; i++)
{
b[i] = (byte)((x >> (i * 8)));
}
return b;
}
/// <summary>
/// ,
/// </summary>
/// <param name="b"></param>
/// <param name="length"></param>
/// <returns></returns>
static int BytesToInt(byte[] b, int length)
{
int temp = 0;
for (int i = 0; i <= length - 1 && i < 4; i++)
{
temp += (int)(b[i] << (i * 8));
}
return temp;
}