C# - 位和字节

标签 c# hex byte bit

我尝试用两个字节 (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/

相关文章:

c# - 在 ASP.NET 问题中使用 jQuery AjaxForm

c# - 从 C# 中的 List<T> 获取不同的值

c# - 转换为十六进制?

java - 怎么可能从java中的不同字节数据中获取相同的字符串?

java - 将串行端口输出重定向到套接字

c# - 我可以在 NumericUpDown 控件中隐藏值吗?

c# - 如何不序列化默认值

php - 十六进制网页颜色

c# - 如何将十六进制转换为字符串?

c++ - 如何访问整数的单个字节?