任何人都能解释一下新手C程序员会理解的,这个函数的作用是什么?
unsigned getunsigned(unsigned char *bufp, int len) {
unsigned value = 0;
int shift = 0;
while (len--) {
value |= *bufp++ << shift;
shift += 8;
}
return value;
}
我想让我最难解决的问题是:
value |= *bufp++ << shift;
另外,任何人都可以提供一种重写方法,以便没有经验的C程序员更清楚地理解吗?
我在为作业进行研究时发现了这段代码,除非我完全理解它正在做什么以及它是如何做的,否则我不愿意使用它。
答案 0 :(得分:5)
这是从bufp
指向的缓冲区中获取连续字节,并将它们放入value
。
value |= *bufp++ << shift;
取bufp
处的值(即地址char
处的bufp
指向)并将其与8位{{1 }}。然后它递增value
以指向缓冲区中的下一个字节。之后,它向bufp
添加了8 - 这就是确定 8位shift
新字节得到ORed的原因。即,value
从0开始,因此在第一次迭代中,shift
的第一个字节替换bufp
的底部8位(替换,因为它们开始为0)。在下一个迭代器中,value
的下一个字节向左移位8个字节,以替换bufp
的下一个8位,依此类推value
个字节。
除此之外:如果len
大于len
,则会写入sizeof(unsigned)
的末尾,导致未定义的行为。
答案 1 :(得分:1)
value |= *bufp++ << shift;
相当于
value = value | (*bufp << shift);
bufp++;
答案 2 :(得分:1)
value |= *bufp++ << shift;
相当于
value = value | (*bufp << shift);
bufp++;
bufp的第一个值转移到shift中的值,结果与|
进行ORed value
,然后bufp
递增。
最后一个班次的值更改为shift +=8
表示shift = shift + 8
因此它需要bufp
中的所有字节,因为while len
变为0
时,while循环不会终止。