C# - 比特和字节

时间:2018-03-11 10:58:46

标签: c# hex byte bits

我尝试以两个字节(byte [2])存储一些信息。

在第一个字节的前四位,我想存储一个编码为0-9的值的“类型信息”。在最后四位+第二个字节中我想存储一个size-info,因此size-info的最大值为4095(0xFFF);

让我们举一些例子来解释我的意思。 当type-in​​fo为5且大小为963时,结果应如下所示:35-C3为十六进制字符串。

35-C3 => 5是type-in​​fo,3C3是963。

03-00 => type-in​​fo 3和size 0。

13-00 => type-in​​fo 3和size 1.

但我不知道如何用C#做这件事并需要一些社区帮助:

byte type = 5;  // hex 5
short size = 963; // hex 3C3
byte[] bytes = ???
string result = BitConverter.ToString(bytes);
// here result should by 35-C3

3 个答案:

答案 0 :(得分:2)

它应该是这样的:

bytes = new byte[2];
bytes[0] = type << 4 | size >> 8;
bytes[1] = size & 0xff;

注意:最初我的数字是错误的,我写了type << 8 | size >> 16,而它应该是type << 4 | size >> 8正如Aleksey在答案中所表明的那样。

评论进入后人的答案:

type位向左移动4,然后将其存储在bytes[0]中,确保它们占据bytes[0]的前4位。通过将size位向右移动8,可确保丢弃低8位大小,仅保留前4位,这些前4位将存储到低4位bytes[0]。它有助于绘制图表:

        bytes[0]                    bytes[1]
+------------------------+ +------------------------+
| 7  6  5  4  3  2  1  0 | | 7  6  5  4  3  2  1  0 |
+------------------------+ +------------------------+

  type << 4 
+-----------+
| 3  2  1  0| <-- type
+-----------+
            +------------+ +------------------------+
            |11 10  9  8 | | 7  6  5  4  3  2  1  0 | <-- size
            +------------+ +------------------------+
              size >> 8           size & 0xff

size是12位数量。这些位在11位到0位。通过向右移动8,你将最右边的8位丢弃,而你只剩下前4位,位于3-0位。然后将这4位存储在bytes[0]的低4位中。

答案 1 :(得分:2)

试试这个:

byte[] bytes = new byte[2];

bytes[0] = (byte) (type << 4 | size >> 8);
bytes[1] = (byte) (size & 0xff);

答案 2 :(得分:0)

对于类型的内存配置文件的微优化不是您通常应该在.NET中烦恼的事情。如果您运行本机C ++,我可以在某种程度上理解这一点,但我仍然建议不要这样做。这项工作很多,效果有限。

但是在.NET中,您只需使用Enumeration(Int8)“Type”和Int16 SizeInfo创建一个类或结构,说“足够好”并将其称为一天。当64位是当今大多数计算机的本机整数大小时,将资源花在更好的东西上,然后从其上删除1个字节的内存。

BitArray是从.NET中的一个字节实际定义特定位的最接近的。它提供了类似类型的一些信息。

如果你想艰难地进行数学计算,Modulo是一个很好的起点。