110,538
社区成员
发帖
与我相关
我的任务
分享
public class ByteQueue
{
private List<byte> m_buffer = new List<byte>();
public bool Find()
{
if (m_buffer.Count == 0)
return false;
int HeadIndex = m_buffer.FindIndex(o => o == 0xA5);
if (HeadIndex == -1)
{
m_buffer.Clear();
return false; //没找到A5
}
else if (HeadIndex != 0) //不为开头移掉之前的字节
{
if (HeadIndex > 1)
m_buffer.RemoveRange(0, HeadIndex);
}
int length = GetLength();
if (m_buffer.Count < length)
{
return false;
}
int TailIndex = m_buffer.FindIndex(o => o == 0xA5); //查找55的位置
if (TailIndex == -1)
{
//这一步为防止连发一个AA开头的包后,没发55,而又发了一个AA
int head = m_buffer.FindLastIndex(o => o == 0xA5);
if (head > -1)
{
m_buffer.RemoveRange(0, head);
}
return false;
}
else if (TailIndex + 1 != length) //计算包尾是否与包长度相等
{
m_buffer.RemoveRange(0, TailIndex);
return false;
}
return true;
}
/// <summary>
/// 命令类型
/// </summary>
/// <returns></returns>
public byte Cmd()
{
if (m_buffer.Count >= 2)
{
return m_buffer[1];
}
return 0;
}
/// <summary>
/// 序号
/// </summary>
/// <returns></returns>
public byte Number()
{
if (m_buffer.Count >= 3)
{
return m_buffer[2];
}
return 0;
}
/// <summary>
/// 包长度
/// </summary>
/// <returns></returns>
public int GetLength()
{
int len = 5;//AA 命令类型 序号 校验和 55
if (m_buffer.Count >= 3)
{
switch (m_buffer[2]) //第三字节为序号
{
case 0x00: //序号
return len + 16;
case 0x01: //序号
return len + 10;
case 0x02: //序号
return len + 12;
}
}
return 0;
}
/// <summary>
/// 提取数据
/// </summary>
public void Dequeue(byte[] buffer, int offset, int size)
{
m_buffer.CopyTo(0, buffer, offset, size);
m_buffer.RemoveRange(0, size);
}
/// <summary>
/// 队列数据
/// </summary>
/// <param name="buffer"></param>
public void Enqueue(byte[] buffer)
{
m_buffer.AddRange(buffer);
}
}
public bool Find()
{
if (m_buffer.Count == 0)
return false;
int HeadIndex = m_buffer.FindIndex(o => o == 0xA5);
if (HeadIndex == -1)
{
m_buffer.Clear();
return false; //没找到A5
}
else if (HeadIndex != 0) //不为开头移掉之前的字节
{
if (HeadIndex > 1)
m_buffer.RemoveRange(0, HeadIndex);
}
int length = GetLength();
if (m_buffer.Count < length)
{
return false;
}
int TailIndex = m_buffer.FindIndex(o => o == 0xA5); //查找55的位置
if (TailIndex == -1)
{
//这一步为防止连发一个AA开头的包后,没发55,而又发了一个AA
int head = m_buffer.FindLastIndex(o => o == 0xA5);
if (head > -1)
{
m_buffer.RemoveRange(0, head);
}
return false;
}
else if (TailIndex + 1 != length) //计算包尾是否与包长度相等
{
m_buffer.RemoveRange(0, TailIndex);
return false;
}
return true;
}
public bool Find()
{
if (m_buffer.Count == 0)
return false;
int HeadIndex = m_buffer.FindIndex(o => o == 0xA5);
if (HeadIndex == -1)
{
m_buffer.Clear();
return false; //没找到A5
}
else if (HeadIndex != 0) //不为开头移掉之前的字节
{
if (HeadIndex > 1)
m_buffer.RemoveRange(0, HeadIndex);
}
int length = GetLength();
if (m_buffer.Count < length)
{
return false;
}
int TailIndex = m_buffer.FindIndex(o => o == 0xA5); //查找55的位置
if (TailIndex == -1)
{
//这一步为防止连发一个AA开头的包后,没发55,而又发了一个AA
int head = m_buffer.FindLastIndex(o => o == 0xA5);
if (head > -1)
{
m_buffer.RemoveRange(0, head);
}
return false;
}
else if (TailIndex + 1 != length) //计算包尾是否与包长度相等
{
m_buffer.RemoveRange(0, TailIndex);
return false;
}
return true;
}