我尝试用两个字节 (byte[2]) 存储一些信息。
在第一个字节的前四位中,我想存储一个编码为 0-9 值的“类型信息”。而在最后四位+第二个字节中我要存储一个size-info,所以size-info的最大值是4095(0xFFF);
让我们举一些例子来解释我的意思。 当类型信息为 5 且大小为 963 时,结果应如下所示:35-C3 作为十六进制字符串。
35-C3 => 5 是类型信息,3C3 是 963。
03-00 => 类型信息 3 和大小 0。
13-00 => 类型信息 3 和大小 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
最佳答案
它应该是这样的:
bytes = new byte[2];
bytes[0] = type << 4 | size >> 8;
bytes[1] = size & 0xff;
注意:最初我的数字是错误的,我写了type << 8 | size >> 16
虽然它应该是 type << 4 | size >> 8
正如阿列克谢在他的回答中所展示的那样。
评论进入后代的答案:
通过移动您的 type
在将它们存储在 bytes[0]
之前向左移动 4 位您确保它们占据 bytes[0]
的前 4 位.通过移动您的 size
右移 8 位,确保大小的低 8 位被丢弃,只保留高 4 位,这些高 4 位将存储到 bytes[0]
的低 4 位中。 .它有助于绘制图表:
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 位中.
关于C# - 位和字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49219227/