如何处理字节中的位
本文关键字:字节 处理 何处理 | 更新日期: 2023-09-27 18:21:39
我有一个包含两个值的单个字节。这是文档:
权限字节分为两个字段。三个最低有效位携带用户的权限级别(0-5)。五大有效位携带覆盖拒绝阈值。如果这些位如果设置为零,则系统拒绝阈值用于确定该用户的分数被认为是接受或拒绝。如果是不为零,则这些位的值乘以10将成为该用户的阈值分数。
权威字节:
7 6 5 4 3 ......... 2 1 0 Reject Threshold .. Authority
我没有任何在C#中使用位的经验。
有人能帮我转换一个字节并获得上面提到的值吗?
我尝试了以下代码:
BitArray BA = new BitArray(mybyte);
但长度回到了29,我本以为是8,即字节中的每一位。
--感谢大家的快速帮助。现在开始工作了!很棒的互联网。
您可以更容易地使用内置的按位AND和右移运算符,而不是BitArray,如下所示:
byte authorityByte = ...
int authorityLevel = authorityByte & 7;
int rejectThreshold = authorityByte >> 3;
要返回单个字节,可以使用按位OR和左移运算符:
int authorityLevel = ...
int rejectThreshold = ...
Debug.Assert(authorityLevel >= 0 && authorityLevel <= 7);
Debug.Assert(rejectThreshold >= 0 && rejectThreshold <= 31);
byte authorityByte = (byte)((rejectThreshold << 3) | authorityLevel);
您对BitArray
的使用不正确。此:
BitArray BA = new BitArray(mybyte);
将被隐式地转换为CCD_ 2。当这种情况发生时,您将触发这个构造函数:
BitArray(int length);
因此,它创造了一个特定的长度。
查看MSDN(http://msdn.microsoft.com/en-us/library/x1xda43a.aspx)你想要这个:
BitArray BA = new BitArray(new byte[] { myByte });
长度将为8(如预期)。
要将字节中五个最高有效位的值作为整数,请将字节右移3
(即8-5
),并使用逐位AND
操作将三个高位设置为零,如下所示:
byte orig = ...
int rejThreshold = (orig >> 3) & 0x1F;
>>
是"右移"运算符。它将第7..3位移动到第4..0位,从而丢弃较低的三位0x1F
是二进制数00011111
,其具有设置为零的高位三位和设置为一的低位五位。用这个数字AND
将三个高位置零
这种技术可以推广到获得其他位模式和其他积分数据类型。将所需的位移到最低有效位,然后应用一个掩码来"剪切"所需的位数。在某些情况下,移位是不必要的(例如,当您获得最低有效位组时)。在其他情况下,如上面所述,屏蔽是不必要的,因为您在无符号类型中获得最高有效位组(如果该类型是有符号的,则需要AND
ing)。
您可能使用了错误的构造函数。
你正在使用的可能是这个,而你需要这个:
var bitArray = new BitArray(new [] { myByte } );