我正在研究串行通信协议。在这个协议中,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,即结束字节!