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

时间:2011-10-19 17:32:15

标签: c# types network-programming filesystems bit-manipulation

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

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

例如,如果我的数字 34 25 15 ,则这些位看起来像:

34---|25----|15--
10001001 10011111

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

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

任何人都有一些建议或者可以给我一个提示来开始这个?

谢谢!

2 个答案:

答案 0 :(得分:2)

我担心你必须亲自编写你的位操作代码。在您的示例中,代码看起来像这样:

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

您可以使用位移运算符(<<>>)以及逻辑位运算符(|&)来操作位。

答案 1 :(得分:1)

  

我查看了BitArray和BitConverter,但我找到了函数   适用于8位,16位和32位类型,而不是自定义类型。

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

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