我需要编写系统,以便通过为客户(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 。
几个小时前我就是谷歌,没有人回答我的问题。如果这个问题不清楚,请告诉我。
答案 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
}
我将实际代码(并解决我的误解)留给读者作为练习。