这行代码有什么作用?

时间:2011-03-05 19:21:20

标签: c

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。

3 个答案:

答案 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。

然后将结果存储在字节数组中的某个位置。