使用LINQ,需要帮助根据从Silverlight套接字接收的数据拆分字节数组吗
收到的消息包包含多条消息,这些消息由页眉=0xFD和页脚=0xFE删除使用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
// 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长度读取和错误处理。然后,他们应该将数据传递给负责执行实际帧处理的缓冲类
- 在编写消息缓冲类时,如果您改变了对数据的思考方式,那么最终会得到更干净的代码。与到达套接字并通过缓冲类“推送”的数据块不同,将其视为发出隐式“读取请求”的缓冲类;当一个数据块进入时,执行一个满足当前“读取请求”的循环,直到该数据块全部用完
- 将消息缓冲区划分为一个类。在不处理异步套接字的情况下,缓冲代码足够复杂。套接字事件处理程序可以负责始终保持异步读取、处理0长度读取和错误处理。然后,他们应该将数据传递给负责执行实际帧处理的缓冲类
- 在编写消息缓冲类时,如果您改变了对数据的思考方式,那么最终会得到更干净的代码。与到达套接字并通过缓冲类“推送”的数据块不同,将其视为发出隐式“读取请求”的缓冲类;当一个数据块进入时,执行一个满足当前“读取请求”的循环,直到该数据块全部用完
- 既然你已经有了合适的框架,那么丹尼尔的解决方案不适合你有什么原因吗
如果您只想使用LINQ,可以这样做:
int messageIndex=0;
var测试=接收缓冲区
//删除SOT字节
哪里