以字节为单位获取bit的值 - C#

时间:2014-05-26 05:01:37

标签: c# bit

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

数据以字节形式给出,总数为255千字节,我需要从字节转换为比特。如果255 kb转换为bit,则将变为2,088,960。

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

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

0 =错误

1 = True

例如,

此客户的网卡号为3,因此bit的值为1.因此,对于其他客户,请说他的NIC为6,则bit的值为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

几个小时前我就是谷歌,没有人回答我的问题。如果这个问题不清楚,请告诉我。

2 个答案:

答案 0 :(得分:1)

二进制为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)
}

答案 1 :(得分:0)

这实际上似乎是一个由太多代码掩盖的相当简单的问题。一个建议:忘记将任何东西转换成位。这样只有痛苦。

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

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

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
} 

我将实际代码(并解决我的误解)留给读者作为练习。