c - 解释这个函数的作用

标签 c

谁能以新手 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 程序员能够更清楚地理解它吗?

我在为一项作业做研究时在网上找到了这段代码,除非我完全理解它在做什么以及它是如何做的,否则我不想使用它。

最佳答案

这是从 bufp 指向的缓冲区中获取连续的字节, 并将它们放入 value .

value |= *bufp++ << shift;正在取值 bufp (即地址 char 指向的 bufp 指向)并将其与 value 的 8 位进行或运算.然后它递增 bufp指向缓冲区中的下一个字节。之后,它将 8 添加到 shift -- 这就是决定 value哪个 8 位的原因新字节得到 ORed。即 shift从 0 开始,所以在第一次迭代中,bufp 的第一个字节替换 value 的低 8 位(替换,因为它们开始时为 0)。在下一个迭代器中,bufp 的下一个字节左移 8 个字节,以替换 value 的下一个 8 位,以此类推 len字节。

旁白:如果len大于 sizeof(unsigned) , 这将写到 value 的末尾,导致未定义的行为。

关于c - 解释这个函数的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13717359/

相关文章:

c++ - 加速度计 'Change in Height' 代码 PIC

c - 使用 isalpha() 在文件中跳过一行

c - 只读字母字符 - C

c - 是否可以使用 PMPI 接口(interface)更改 MPI_Probe 的计数?

c - 在 C 中用 jansson 解析 JSON

c - 在 C 指针中查询

c - 如何解决 mingw(或 mingw-w64)gcc 中缺少 InitOnceExecuteOnce?

c++ - 无法在 Arch Linux 中安装 Cairo 包

c - 调试散列结果 : Lengths, 数组、字符

c++ - 在工具栏上过度绘制?替代想法?