获取字节中bit的值- c#

本文关键字:的值 bit 字节 获取 | 更新日期: 2023-09-27 18:05:12

我需要编写系统,通过为客户(NIC)签发的号码来检查该用户是否有效。

数据以字节的形式给出,总数为255kb,我需要将字节转换为位。如果将255 kb转换为位,它将变成2,088,960。

假设我们将F9作为第一个字节,当转换为二进制时,它将变成11111001。

NIC | Binary
1   = 1
2   = 1
3   = 1
4   = 1
5   = 1
6   = 0
7   = 0
8   = 1

0 = False

1 = True

例如,

该客户的NIC编号为3,因此bit的值为1。所以对于另一个客户,假设他的网卡是6,那么比特的值是0。

如果bit的值是0,那么这个客户是有效的。但是如果值是1,那么这个客户是无效的。

到目前为止发生了什么

 var reader = com.ExecuteScalar() as byte[];
 if (reader != null)
 {   
     //From database to bytes array
     list_bytes = reader;
     //From bytes array to bit array
     BitArray bits = new BitArray(list_bytes);
     for (int a = 1; a <= NIC; a++)
     {
       //Debug purpose
       if(a == NIC)
         lblStatus.Text = Convert.ToBoolean(bits[a - 1]).ToString();                        
     }
 }

问题是,假设我输入NIC为1,那么它返回= True。当我输入NIC为2时,它返回False,但答案应该是True。

NIC 1 = True = 1
NIC 2 = False = 0
NIC 3 = False = 0
NIC 4 = True = 1
NIC 5 = True = 1
NIC 6 = True = 1
NIC 7 = True = 1
NIC 8 = True = 1

二进制是10011111,转换成字节是0x9F,但是数据应该是0xF9

几个小时前我在谷歌上搜索,没有一个答案符合我的问题。如果这个问题不清楚,请让我知道。

获取字节中bit的值- c#

二进制是10011111,转换成字节是0x9F,但是数据应该是0xF9。

问题是你在数组上推的第一个值将是你再次从数组中取出的第一个值(逻辑)。但在你的例子中,你不想要这个,你想从最后一个值开始,一直到第一个值,然后它会工作,最终返回0xF9

for (int a = NIC; a >= 0; a--)
{
    // Loop will run from NIC until it reaches 0. (can be 1 to, depending if your collection is zero-based)
}

这实际上是一个被太多代码掩盖的相当简单的问题。一个建议是:不要把任何东西都转换成比特。那样只有痛苦。

据我所知,如果你有一个字节数组,每个字节代表一个客户。客户有一个网卡,您只需根据网卡检查客户字节中是否设置了一个特定的位。代码看起来像这样:

Byte customer_byte = list_bytes[customer_id];
Boolean isvalid = test_bit(customer_byte, customer_nic);

网卡位编号为1 ~ 8,其中1表示0x80, 8表示0x01。test_bit函数可以这样写:

Boolean test_bit(Byte value, Int bitno) { 
  Byte mask = POW(2, 8 - bitno); // POW is the power function
  return (value AND bitno) NEQ 0; // AND is the bitwise operator
} 

我把编写实际代码(并修正我的误解)作为练习留给读者。