我有一个包含两个值的字节。这是文档:
权限字节分为两个字段。三个最低有效位带有用户的权限级别(0-5)。五个最多 有效位带有覆盖拒绝阈值。如果这些位是 设置为零,系统拒绝阈值用于确定是否 该用户的分数被视为接受或拒绝。如果它们是 不是零,那么这些位的值乘以十将是 该用户的门槛评分。
授权字节:
7 6 5 4 3 ......... 2 1 0 Reject Threshold .. Authority
我没有任何使用C#中的位的经验。
有人可以帮我转换字节并获得上述值吗?
我尝试过以下代码:
BitArray BA = new BitArray(mybyte);
但是长度又回到了29,而我预计会有8个,就是字节中的每个位。
- 感谢大家的快速帮助。现在就搞定了!很棒的互联网。
答案 0 :(得分:7)
您可以更轻松地使用内置的BitArray和bitwise AND运算符代替right-shift,而不是:
byte authorityByte = ...
int authorityLevel = authorityByte & 7;
int rejectThreshold = authorityByte >> 3;
要获得单字节,您可以使用bitwise OR和left-shift运算符:
int authorityLevel = ...
int rejectThreshold = ...
Debug.Assert(authorityLevel >= 0 && authorityLevel <= 7);
Debug.Assert(rejectThreshold >= 0 && rejectThreshold <= 31);
byte authorityByte = (byte)((rejectThreshold << 3) | authorityLevel);
答案 1 :(得分:6)
您对BitArray
的使用不正确。这样:
BitArray BA = new BitArray(mybyte);
..将隐式转换为int
。当发生这种情况时,您将触发此构造函数:
BitArray(int length);
..因此,它以特定的长度创建它。
查看MSDN(http://msdn.microsoft.com/en-us/library/x1xda43a.aspx),你想要这个:
BitArray BA = new BitArray(new byte[] { myByte });
长度将为8(如预期的那样)。
答案 2 :(得分:4)
要将字节中五个最高有效位的值作为整数,将字节向右移动3
(即8-5
),并将三个高位设置为零使用按位AND
操作,如下所示:
byte orig = ...
int rejThreshold = (orig >> 3) & 0x1F;
>>
是“右移”操作符。它将位7..3移动到位置4..0,丢弃三个低位。0x1F
是二进制数00011111
,其高三位设置为零,低五位设置为一。 AND
- 使用此数字将三个高位归零。这种技术可以推广到其他位模式和其他整数数据类型。您将所需的位移到最不重要的位置,并应用一个“剪切”您想要的位数的掩码。在某些情况下,不需要移位(例如,当您获得最不重要的位组时)。在其他情况下,如上所述,掩码不是必需的,因为您获得了无符号类型中最重要的位组(如果类型是有符号的,则需要AND
。)
答案 3 :(得分:3)