一些回答的人
tcpbuffer.Skip(20).Take(20);
做错了。这是优秀解决方案,但代码应如下所示:
packet.Skip(20).Take(20);
您应该在主 packet 上使用 Skip 和 Take 方法,并且您发布的代码中不应存在 tcpbuffer。你也不必使用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 不是本地变量,而是 private 或 protected 或 public 或 internal 和 static 或不是 field(换句话说,它应该在您发布的代码执行的 outside 方法中定义和创建)。因此 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 之前键入 this.,它是可选的,但如果您将其定义为静态,那么您不能这样做。相反,您必须输入类名,然后输入点“.”,或者留下它(只需输入字段的名称即可)。