使用LINQ,需要帮助根据从Silverlight套接字接收的数据拆分字节数组吗

使用LINQ,需要帮助根据从Silverlight套接字接收的数据拆分字节数组吗,linq,sockets,network-programming,parsing,split,Linq,Sockets,Network Programming,Parsing,Split,收到的消息包包含多条消息,这些消息由页眉=0xFD和页脚=0xFE删除 // sample message packet with three // different size messages List<byte> receiveBuffer = new List<byte>(); receiveBuffer.AddRange(new byte[] { 0xFD, 1, 2, 0xFE, 0xFD, 1, 2, 3, 4, 5, 6, 7, 8, 0xF

收到的消息包包含多条消息,这些消息由页眉=0xFD和页脚=0xFE删除

// sample message packet with three
// different size messages
List<byte> receiveBuffer = new List<byte>();
receiveBuffer.AddRange(new byte[]
  { 0xFD, 1, 2, 0xFE, 
    0xFD, 1, 2, 3, 4, 5, 6, 7, 8, 0xFE,
    0xFD, 33, 65, 25, 44, 0xFE});


// note: this sample code is without synchronization, 
//       statements, error handling...etc.
while (receiveBuffer.Count > 0)
{
    var bytesInRange = receiveBuffer.TakeWhile(n => n != 0xFE);

    foreach (var n in bytesInRange)
        Console.WriteLine(n);

    // process message.. 
    // 1) remove bytes read from receive buffer
    // 2) construct message object...
    // 3) etc...

     receiveBuffer.RemoveRange(0, bytesInRange.Count());

}
//带有三个
//不同大小的消息
List receiveBuffer=新列表();
receiveBuffer.AddRange(新字节[])
{0xFD,1,2,0xFE,
0xFD,1,2,3,4,5,6,7,8,0xFE,
0xFD,33,65,25,44,0xFE});
//注意:此示例代码没有同步,
//语句、错误处理等。
while(receiveBuffer.Count>0)
{
var bytesInRange=receiveBuffer.TakeWhile(n=>n!=0xFE);
foreach(字节数范围内的变量n)
控制台写入线(n);
//处理消息。。
//1)删除从接收缓冲区读取的字节
//2)构造消息对象。。。
//3)等等。。。
receiveBuffer.RemoveRange(0,bytesInRange.Count());
}
如您所见,(包括页眉/页脚),此消息包中的第一条消息包含4个字节,第二条消息包含10个字节,第三条消息包含6个字节

在while循环中,我希望TakeWhile添加不等于消息页脚部分的字节

注意:由于我是在读取字节后删除它们的,因此可以预期标头始终位于位置“0”

我搜索了拆分字节数组的示例,但没有在大小未知且波动的数组上演示拆分

任何帮助都将不胜感激。 多谢

这个想法是:

while not the end of receiveBuffer 
 if receiverbuffer[actualposition] != 0xfe
    insert this position in a listA
  if receiverbuffer[actualposition] == 0xfe
    insert the listA into another listB
    listA become null and you go to next line
go to next position of receivebuffer
因此,在流程结束时,您将有一个列表>

我希望看起来不会太混乱

这个想法是:

while not the end of receiveBuffer 
 if receiverbuffer[actualposition] != 0xfe
    insert this position in a listA
  if receiverbuffer[actualposition] == 0xfe
    insert the listA into another listB
    listA become null and you go to next line
go to next position of receivebuffer
因此,在流程结束时,您将有一个列表>


我希望看起来不会太混乱

不确定这是否只是演示代码中引入的错误,但在从缓冲区中删除上一条消息时,确实需要在计数中添加一个:

receiveBuffer.RemoveRange(0, bytesInRange.Count() + 1);
而不是

receiveBuffer.RemoveRange(0, bytesInRange.Count());
通过这一更改,代码将打印出除三条消息中每个消息的结束标记之外的每个字节

以下代码变体打印每条消息的每个正文字节:

List<byte> receiveBuffer = new List<byte>();
receiveBuffer.AddRange(new byte[] 
{
    0xFD, 1, 2, 0xFE,  
    0xFD, 1, 2, 3, 4, 5, 6, 7, 8, 0xFE, 
    0xFD, 33, 65, 25, 44, 0xFE
});

while (receiveBuffer.Count > 0)
{
    var bytesInRange = receiveBuffer.Skip(1).TakeWhile(n => n != 0xFE);

    foreach (var n in bytesInRange)
        Console.Write("{0} ", n);

    Console.WriteLine("\n");
    receiveBuffer.RemoveRange(0, bytesInRange.Count() + 2);
}
List receiveBuffer=new List();
receiveBuffer.AddRange(新字节[])
{
0xFD,1,2,0xFE,
0xFD,1,2,3,4,5,6,7,8,0xFE,
0xFD、33、65、25、44、0xFE
});
while(receiveBuffer.Count>0)
{
var bytesInRange=receiveBuffer.Skip(1).TakeWhile(n=>n!=0xFE);
foreach(字节数范围内的变量n)
Console.Write(“{0}”,n);
Console.WriteLine(“\n”);
receiveBuffer.RemoveRange(0,bytesInRange.Count()+2);
}

不确定这是否只是演示代码中引入的错误,但在从缓冲区中删除上一条消息时,确实需要在计数中添加一个错误:

receiveBuffer.RemoveRange(0, bytesInRange.Count() + 1);
而不是

receiveBuffer.RemoveRange(0, bytesInRange.Count());
通过这一更改,代码将打印出除三条消息中每个消息的结束标记之外的每个字节

以下代码变体打印每条消息的每个正文字节:

List<byte> receiveBuffer = new List<byte>();
receiveBuffer.AddRange(new byte[] 
{
    0xFD, 1, 2, 0xFE,  
    0xFD, 1, 2, 3, 4, 5, 6, 7, 8, 0xFE, 
    0xFD, 33, 65, 25, 44, 0xFE
});

while (receiveBuffer.Count > 0)
{
    var bytesInRange = receiveBuffer.Skip(1).TakeWhile(n => n != 0xFE);

    foreach (var n in bytesInRange)
        Console.Write("{0} ", n);

    Console.WriteLine("\n");
    receiveBuffer.RemoveRange(0, bytesInRange.Count() + 2);
}
List receiveBuffer=new List();
receiveBuffer.AddRange(新字节[])
{
0xFD,1,2,0xFE,
0xFD,1,2,3,4,5,6,7,8,0xFE,
0xFD、33、65、25、44、0xFE
});
while(receiveBuffer.Count>0)
{
var bytesInRange=receiveBuffer.Skip(1).TakeWhile(n=>n!=0xFE);
foreach(字节数范围内的变量n)
Console.Write(“{0}”,n);
Console.WriteLine(“\n”);
receiveBuffer.RemoveRange(0,bytesInRange.Count()+2);
}

其中真正棘手的部分是套接字是一个数据流,因此您的缓冲区实际上可能只包含部分消息。我的代码实现了一个基于单字节定界符的“framer”,它可以正确地处理部分读取。它经过了全面的单元测试

根据几十年的经验,请注意“framer”类的以下设计提示:

  • 将消息缓冲区划分为一个类。在不处理异步套接字的情况下,缓冲代码足够复杂。套接字事件处理程序可以负责始终保持异步读取、处理0长度读取和错误处理。然后,他们应该将数据传递给负责执行实际帧处理的缓冲类
  • 在编写消息缓冲类时,如果您改变了对数据的思考方式,那么最终会得到更干净的代码。与到达套接字并通过缓冲类“推送”的数据块不同,将其视为发出隐式“读取请求”的缓冲类;当一个数据块进入时,执行一个满足当前“读取请求”的循环,直到该数据块全部用完

其中真正棘手的部分是套接字是一个数据流,因此您的缓冲区实际上可能只包含部分消息。我的代码实现了一个基于单字节定界符的“framer”,它可以正确地处理部分读取。它经过了全面的单元测试

根据几十年的经验,请注意“framer”类的以下设计提示:

  • 将消息缓冲区划分为一个类。在不处理异步套接字的情况下,缓冲代码足够复杂。套接字事件处理程序可以负责始终保持异步读取、处理0长度读取和错误处理。然后,他们应该将数据传递给负责执行实际帧处理的缓冲类
  • 在编写消息缓冲类时,如果您改变了对数据的思考方式,那么最终会得到更干净的代码。与到达套接字并通过缓冲类“推送”的数据块不同,将其视为发出隐式“读取请求”的缓冲类;当一个数据块进入时,执行一个满足当前“读取请求”的循环,直到该数据块全部用完

    • 既然你已经有了合适的框架,那么丹尼尔的解决方案不适合你有什么原因吗

      如果您只想使用LINQ,可以这样做:

      int messageIndex=0;
      var测试=接收缓冲区
      //删除SOT字节
      哪里