一些回答的人
tcpbuffer.Skip(20).Take(20);
做错了。这是一个很好的解决方案,但代码应如下所示:
packet.Skip(20).Take(20);
您应该在主数据包上使用 Skip 和 Take 方法,并且您发布的代码中不应存在tcpbuffer 。你也不必使用 then System.Buffer.BlockCopy
。
JaredPar几乎是正确的,但他忘记了 Take 方法
TCPHeader tcp = Parse(packet.Skip(20));
但他没有弄错tcpbuffer。您发布的代码的最后一行应如下所示:
TCPHeader tcp = Parse(packet.Skip(20).Take(20));
但是,如果您仍然想使用 System.Buffer.BlockCopy 而不是 Skip and Take,因为 Steven Robbins 回答的性能可能更好:“但是 System.Buffer.BlockCopy / System.Array.Copy 可能更有效”,或者您的Parse 函数无法处理IEnumerable<byte>
,或者您在发布的问题中更习惯 System.Buffer.Block,那么我建议您只使 tcpbuffer不是局部变量,而是私有或受保护或公共或内部和静态或非字段(在换句话说,它应该在外部定义和创建执行您发布的代码的方法)。因此 tcpbuffer 只会被创建一次,并且每次你传递你在 System.Buffer.BlockCopy 行发布的代码时都会设置他的值(字节)。
这样你的代码可以看起来像:
class Program
{
//Your defined fields, properties, methods, constructors, delegates, events and etc.
private byte[] tcpbuffer = new byte[20];
Your unposted method title(arguments/parameters...)
{
//Your unposted code before your posted code
//byte[] tcpbuffer = new byte[ 20 ]; No need anymore! this line can be removed.
System.Buffer.BlockCopy( packet, 20, this.tcpbuffer, 0, 20 );
TCPHeader tcp = Parse( this.tcpbuffer );
//Your unposted code after your posted code
}
//Your defined fields, properties, methods, constructors, delegates, events and etc.
}
或者只是必要的部分:
private byte[] tcpbuffer = new byte[20];
...
{
...
//byte[] tcpbuffer = new byte[ 20 ]; No need anymore! This line can be removed.
System.Buffer.BlockCopy( packet, 20, this.tcpbuffer, 0, 20 );
TCPHeader tcp = Parse( this.tcpbuffer );
...
}
如果你这样做了:
private byte[] tcpbuffer;
相反,您必须在构造函数上添加以下行:
this.tcpbuffer = new byte[20];
或者
tcpbuffer = new byte[20];
你知道你不必输入这个。在 tcpbuffer 之前,它是可选的,但是如果你将它定义为静态的,那么你就不能这样做。相反,您必须输入类名,然后输入点“.”,或者留下它(只需输入字段的名称,仅此而已)。