答えてくれた何人か
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));
ただし、Skip と Take の代わりに System.Buffer.BlockCopy を使用したい場合は、Steven Robbins が答えたようにパフォーマンスが向上する可能性があります。「しかし、System.Buffer.BlockCopy / System.Array.Copy はおそらくより効率的です」解析関数が を処理できないIEnumerable<byte>
か、投稿された質問で System.Buffer.Block に慣れている場合は、単純にtcpbufferをローカル変数ではなく、privateまたはprotectedまたはpublicまたはinternalおよびstaticまたは notフィールドにすることをお勧めします(inつまり、外部で定義および作成する必要があります投稿されたコードが実行されるメソッド)。したがって、tcpbuffer は1 回だけ作成され、その値 (バイト) は 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 の前はオプションですが、静的に定義した場合、それはできません。代わりに、クラス名を入力してからドット「.」を入力するか、そのままにしておく必要があります (フィールドの名前を入力するだけです)。