C# 接收到未知字节

C# 接收到未知字节,c#,ipv4,packet-capture,C#,Ipv4,Packet Capture,通过我自己的位阅读器逐位读取来捕获IP数据包 public class BitReader { int Index; byte Current; Stream Reader; public BitReader ( Stream Memory ) { Reader = Memory; } public bool? ReadBit ( ) { if ( Index == 8 ) {

通过我自己的位阅读器逐位读取来捕获IP数据包

public class BitReader
{
    int Index;
    byte Current;
    Stream Reader;

    public BitReader ( Stream Memory )
    {
        Reader = Memory;
    }

    public bool? ReadBit ( )
    {
        if ( Index == 8 )
        {
            Index = 0;
            Current = ( byte ) Reader . ReadByte ( );
        }

        if ( Current == -1 )
        {
            return null;
        }
        else
        {

            return ( Current & ( 1 << ( 7 - Index++ ) ) ) != 0;
         // return ( Current & ( 1 << Index++ ) ) != 0;
        }
    }
}
编辑1:

MemoryStream _MemoryStream = new MemoryStream ( Buffer , 0 , Length );
BitReader _BitReader = new BitReader ( _MemoryStream );

            for ( int Loop = 0 ; Loop < 21 ; Loop++ )
            {
                bool? Result = _BitReader . ReadBit ( );

                if ( Loop % 8 == 0 && Loop != 0 )
                {
                    myTextBox . Invoke ( new Action ( delegate { myTextBox . Text += " "; } ) );
                }

                if ( Result . HasValue )
                {
                    myTextBox . Invoke ( new Action ( delegate { myTextBox . Text += Result . Value ? 1 : 0; } ) );
                }
            }
从Index==0开始,只有在Index==8时才读取下一个字节。这意味着您读取的第一个字节将始终为零。要解决此问题,请在构造函数中设置Index=8


此外,由于字节永远不能为-1,检查Current==-1是否为false的条件将始终为false,您将在文件末尾得到无限个1,因为这就是将-1转换为字节时得到的结果。

非常感谢,我刚刚找到了您的答案,并将其更改为如果索引%8=0顺便说一下-1只是EOS流结束标志&我正在检查它,请就此提供您的建议?
MemoryStream _MemoryStream = new MemoryStream ( Buffer , 0 , Length );
BitReader _BitReader = new BitReader ( _MemoryStream );

            for ( int Loop = 0 ; Loop < 21 ; Loop++ )
            {
                bool? Result = _BitReader . ReadBit ( );

                if ( Loop % 8 == 0 && Loop != 0 )
                {
                    myTextBox . Invoke ( new Action ( delegate { myTextBox . Text += " "; } ) );
                }

                if ( Result . HasValue )
                {
                    myTextBox . Invoke ( new Action ( delegate { myTextBox . Text += Result . Value ? 1 : 0; } ) );
                }
            }
MemoryStream _MemoryStream = new MemoryStream(Buffer, 0, Length);
BinaryReader _BinaryReader = new BinaryReader(_MemoryStream );
private byte VersionAndHeaderLength;
VersionAndHeaderLength = _BinaryReader.ReadByte();