for (nbyte=0; nbyte<6; nbyte++) {
mac->byte[nbyte] = (char) (strtoul(string+nbyte*3, 0, 16) & 0xFF);
}
这是在macchanger中找到的一小段代码,string是指向MAC地址的char指针,我不知道为什么必须将它转换为unsigned long int,为什么必须i * 3然后和它一起使用0xFF。
答案 0 :(得分:4)
字符串很可能是
形式的mac地址XX:YY:ZZ:AA:BB:CC
执行nbyte*3
每次迭代时,将“起始偏移量”指针向上移动3个字符,跳过:
。然后strotoul读取16位(2个字符)并将它们转换为无符号长整数,然后用0xFF进行AND运算以除去除最低字节之外的所有字符,然后将其转换为字符。
答案 1 :(得分:3)
它是从十六进制字符串解析的,strtoul的第三个参数是转换的基础(在本例中为16)。输入大概是这种形式:
12:34:56:78:9a:bc
指针每次递增3以从每对十六进制数字开始,这些数字相隔三个,包括冒号。
我认为& 0xFF
在这里是绝对必要的。据推测,可能会尝试正确处理输入包含大于0xFF的数字的情况,但由于其他原因,算法仍然会因此情况而失败。
答案 2 :(得分:2)
string+nbyte*3
string是指向char的指针(因为所有C字符串都是)。将一个整数x添加到指针时,您将获得位置指针+ x。通过添加nbyte * 3,您可以将3添加到指针,然后添加6,然后添加第9,
strtoul将字符串转换为整数。具体在这里,通过传递16,其指定基数16(十六进制)作为字符串中的格式。这里通过传递nbyte * 3,你的指针指向从字符串的第3,第6,第9等字符开始的子字符串。
在每个地点进行转换后,&amp; 0xFF取消设置超过8 LSB的任何位,然后将该值转换为char。
然后将结果存储在字节数组中的某个位置。