与.NET之间的二进制协议(C#语法)

与.NET之间的二进制协议(C#语法),c#,.net,binary,protocols,C#,.net,Binary,Protocols,我想听听你是如何解决这类编程任务的!? 每种类型(OPER=1类型)对应一个特定的信息 这只是具有相同结构的大约10种规格中的一种。首选一种创建这些“转换器”(协议)的通用方法 如果你正在读/写这篇文章,我会简单地在流级别翻译它,比如: int b = source.ReadByte(); if (b < 0) throw new EndOfStreamException(); int operx = b & 15; int oper = (b >> 4) &

我想听听你是如何解决这类编程任务的!? 每种类型(OPER=1类型)对应一个特定的信息

这只是具有相同结构的大约10种规格中的一种。首选一种创建这些“转换器”(协议)的通用方法


如果你正在读/写这篇文章,我会简单地在
级别翻译它,比如:

int b = source.ReadByte();
if (b < 0) throw new EndOfStreamException();
int operx = b & 15;
int oper = (b >> 4) & 15;            
b = source.ReadByte();
if (b < 0) throw new EndOfStreamException();
int prefix = b & 7;
int reg = (b >> 3) & 31;
b = source.ReadByte();
if (b < 0) throw new EndOfStreamException();
int period = b & 7;
int fas = (b >> 3) & 3;
int tar = (b >> 5) & 7;
intb=source.ReadByte();
如果(b<0)抛出新的EndOfStreamException();
int operx=b&15;
int oper=(b>>4)和15;
b=source.ReadByte();
如果(b<0)抛出新的EndOfStreamException();
int前缀=b&7;
int reg=(b>>3)和31;
b=source.ReadByte();
如果(b<0)抛出新的EndOfStreamException();
国际时段=b&7;
intfas=(b>>3)和3;
inttar=(b>>5)和7;

如果你正在做大量的工作,你可以把它包装成更优雅的东西,也许可以使用属性来指定偏移量——但是10?无聊的。。。不值得。编写一个健壮的通用转换器是一项艰巨的工作。

如果不想屏蔽和移位位,可以使用BitVector32结构。它的CreateSection()方法允许您将最多4个字节分成几组位,然后索引器允许您读取和写入位值。

Thank's。按位移位运算符不是我真正的学校,也许直到现在?虽然我想我看到了这个样本给我的。你想给它一个简短的描述吗?15, 31? 我要说的是,这个表是一个dousin(每个位块有1-20个选项)中最大的一个@dingir15十进制是二进制1111,即捕获最右边的4位。例如,看一下
(b>>4)&15,这实际上是“将字节的左半部分作为一个整数”——先移位4位,然后再移位4位。同样地,
(b>>3)&31允许我们访问“reg”-我们丢弃构成“prefix”的3位,并获取5位(十进制31是二进制11111)