Некоторые люди, которые ответили
tcpbuffer.Skip(20).Take(20);
сделал это неправильно. Это отличное решение, но код должен выглядеть так:
packet.Skip(20).Take(20);
Вы должны использовать методы 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, потому что, возможно, он лучше по производительности, как сказал Стивен Роббинс: «Но 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];
Вы знаете, что вам не нужно вводить this. перед tcpbuffer, это необязательно, но если вы определили его как статическое, то вы не сможете сделать это. Вместо этого вам придется ввести имя класса, а затем точку '.' Или оставить его (просто введите имя поля и все).