私はシリアル通信プロトコルに取り組んでいます。このプロトコルでは、packt はバイトで構成され、先頭と末尾は0x7E
.
プロトコルは、エスケープする、または0x7E
エスケープ0x7D
する必要がある任意のバイトを示します。0x7D 0x5E
0x7d 0x5D
サンプルパケットは次のとおりです。
7E 40 09 00 BE EF 05 7E 06 01 02 03 04 05 7E
ご覧のとおりbyte[7]
、このパケットでは 2 バイトに置き換える必要があります0x7D 0x5E
。これに対して、私は以下の方法を書きましたが、このタスクを実行できません:
private List<byte> Finalize(List<byte> packet)
{
int u = 1; //keep track of end of pack
//because if escape characters are present
//end bit will be shifted to right
//Walk through list and fix escape bytes
for (int i = 1; i < packet.Count; i++)
{
if (packet[i] == 0x7D)
{
packet[u] = 0x7D;
packet[u + 1] = 0x5D;
u += 2;
}
else if (packet[i] == 0x7E) //Sync Byte
{
packet[u] = 0x7D;
packet[u + 1] = 0x5E;
u += 2;
}
else
{
packet[u] = packet[i]; //Exception here!!
u++;
}
}
return packet;
}
メソッドはArgumentOutOfRangeException
. 誰かが何が問題なのか教えてもらえますか!? 正しいロジックを実装したと思いますが、インデックスを適切に処理していないようです!
ループはインデックス 1 から開始しています。これは開始バイトであり、変更すべきではないためです。また、リストの最後のバイトである 0x7E (最後のバイト) も変更しないでください。