C# 接收到未知字节
通过我自己的位阅读器逐位读取来捕获IP数据包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 ) {
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();