C# 从非八位字节位创建数据类型

C# 从非八位字节位创建数据类型,c#,types,network-programming,filesystems,bit-manipulation,C#,Types,Network Programming,Filesystems,Bit Manipulation,我已经设计了一个自定义文件格式/网络消息,以尽可能减少大小,但我不知道如何实现它。任何提示都会有帮助 前2个字节对应于2个数字,范围从0到63,所以我使用6位。在剩下的4位中,我存储另一个数字,从0到15 例如,如果我有数字34、25和15,那么这些位看起来像: 34---|25----|15-- 10001001 10011111 34---|25----|15-- 10001001 10011111 我查看了位数组和位转换器,但我发现函数适用于8位、16位和32位类型,而不是自定义类型 当然

我已经设计了一个自定义文件格式/网络消息,以尽可能减少大小,但我不知道如何实现它。任何提示都会有帮助

前2个字节对应于2个数字,范围从0到63,所以我使用6位。在剩下的4位中,我存储另一个数字,从0到15

例如,如果我有数字342515,那么这些位看起来像:

34---|25----|15-- 10001001 10011111 34---|25----|15-- 10001001 10011111 我查看了位数组位转换器,但我发现函数适用于8位、16位和32位类型,而不是自定义类型

当然,完整的格式要长得多,但如果我理解这一点,我想我可以继续

谁有什么建议或者可以给我一个开始的提示

谢谢

我查看了BitArray和BitConverter,但我发现函数 使用8位、16位和32位类型,而不是自定义类型

您必须编写自己的函数。我只是建议建立一个结构。然后,您可以发送X字节,将这些字节读取并解析到您的结构中,而不必担心编写自己的方法


你通常会这样做。您可以定义结构的确切大小,它的工作方式与您希望的完全相同。

恐怕您必须自己编写位操作代码。在您的示例中,代码如下所示:

int a = 34;
int b = 25;
int c = 15;

byte[] data = new byte[2];

// Store to byte array
data[0] = (byte)((a << 2) + (b >> 4));
data[1] = (byte)((b << 4) + c);

// Read from byte array
a = data[0] >> 2;
b = ((data[0] & 3) << 4) + (data[1] >> 4);
c = data[1] & 15;

Console.WriteLine("a = " + a); // 34
Console.WriteLine("b = " + b); // 25
Console.WriteLine("c = " + c); // 15
inta=34;
int b=25;
int c=15;
字节[]数据=新字节[2];
//存储到字节数组
数据[0]=(字节)((a>4));
数据[1]=(字节)((b>2;
b=((数据[0]&3]>4);
c=数据[1]&15;
Console.WriteLine(“a=“+a);//34
Console.WriteLine(“b=“+b);//25
Console.WriteLine(“c=“+c);//15

您可以使用位移位运算符(
)和逻辑位运算符(
&
)来操作位。

只是因为我感兴趣-应用程序是什么?缓冲区的大小是什么(您看到了什么样的保存方式)?你的观点是什么?在这个例子中,你仍然在通过线路发送16位;你说“这是8+8位”或“这是6+6+4位”有什么帮助?我遗漏了什么吗?在您的示例中,发送的第一个数字实际上是35。可能是interest@Veehmot-您知道发送0x000005和发送0x5将发送相同的值,对吗?BitConverter正是您想要使用的。现在这很有用!我想我应该手工制作所有访问器,但好的是可以移植到所有支持按位操作的语言上。我用每个操作的显示来补充您的答案:哦,很抱歉纠正您的错误,但是改为
data[1]&31
应该是
data[1]&15