这个不安全的代码如何工作?

时间:2010-08-10 15:38:34

标签: c#

我读了“C.Sharp 3.0 in a Nutshell”一书,并且遇到了我感兴趣的下一段代码。

  unsafe void RedFilter(int[,] bitmap)
    {
      int length = bitmap.Length;
      fixed (int* b = bitmap)
      {
        int* p = b;
        for(int i = 0; i < length; i++)
          *p++ &= 0xFF;
      }
    }

有人能解释一下这个“* p ++&amp; = 0xFF”是如何工作的?

5 个答案:

答案 0 :(得分:9)

该功能可能是为了获取位图图像,并过滤掉除红色以外的所有颜色。

这假定它是一个32位位图,其中每个像素由int表示。 您取消引用p当前指向的内存位置(int),并将其与0xFF进行AND运算,这实际上只留下像素的红色分量(假设最低的字节是红色组件)。您还会自动将指针递增到下一个int++)。那回答了吗?

答案 1 :(得分:6)

它与此相同(IMO原始的*p++ &= 0xFF;技巧有点令人讨厌 - 它是一行代码,它做了两件事):

*p = *p & 0xFF;
p++;

a = a & 0xFF这样的表达式将变量a的最后8位设置为零。

答案 2 :(得分:2)

这是你在C语言中找到的那种语法,在那里也不赞同但并不罕见。写出来:

int temp = *p;
temp = temp & 0x000000ff;
*p = temp;
p = p + 1;   // Move pointer by 4 bytes.

这取决于位图格式,如果这将很好。不常见的是,代码将像素的alpha重置为零。制作黑色图像。

答案 3 :(得分:1)

此代码递增指针p,使其指向位图中的下一个像素,然后屏蔽除最低有效字节之外的所有字节,以Microsoft BMP格式(我假设在其他非标准实现中)为BGR格式。

这具有去除除红色之外的所有颜色成分的效果。

答案 4 :(得分:1)

你可能知道,

x &= y

相同

x = x&amp; ÿ

'int'以'0xff'结尾,将高3字节的所有位设置为零(掩码)。

askterisk正在取消引用指针,所以

*p

是一个整数。

'post increment'更新实际指针值以指向内存中的下一个整数。

总而言之,代码将在内存中运行'length'整数,并屏蔽除最低字节之外的所有字节(即,如果这些是[A] BGR颜色值,则为'红色'字节)。