我尝试以两个字节(byte [2])存储一些信息。
在第一个字节的前四位,我想存储一个编码为0-9的值的“类型信息”。在最后四位+第二个字节中我想存储一个size-info,因此size-info的最大值为4095(0xFFF);
让我们举一些例子来解释我的意思。 当type-info为5且大小为963时,结果应如下所示:35-C3为十六进制字符串。
35-C3 => 5是type-info,3C3是963。
03-00 => type-info 3和size 0。
13-00 => type-info 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
答案 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)