c - 从 32 位数字中提取字节

标签 c casting bitmask

这并不重要,应该很简单,我只是不明白我做错了什么。 这背后的故事是,我正在 attiny85 上使用tinyNeoPixel lib,并且我试图比我需要的更深入一些。

这是传统的 ANSI C,我使用 Raspberry Pi3 进行此测试,但对于本例来说,这应该是无关紧要的。 printf 上的 sizeof(c) 仅显示“c”是 4 个字节,正如预期的那样。

我正在尝试提取存储为 32 位数字的颜色的红色、绿色和蓝色部分

显然我无法以 1 字节值的形式返回结果,请同样的人告诉我该怎么做?仅转换为 (uint8_t) 只会产生零。

谢谢。

pi3:~/src$ cat a.c
#include <stdio.h>

typedef unsigned char uint8_t;
typedef unsigned long int uint32_t;

#define Red(x)   (x & 0xff000000)
#define Green(x) (x & 0x00ff0000)
#define Blue(x)  (x & 0x0000ff00)

void main()
{
    uint32_t c;
    uint8_t r,g,b;

    c=0xffeecc00;
    r=Red(c);
    g=Green(c);
    b=Blue(c);

    printf("%d - %08x - %02x %02x %02x\n", sizeof(c), c, r, g, b);
    printf("%d - %08x - %02x %02x %02x\n", sizeof(c), c, Red(c), Green(c), Blue(c));
}


pi3:~/src$ gcc a.c -o a
pi3:~/src$ ./a
4 - ffeecc00 - 00 00 00
4 - ffeecc00 - ff000000 ee0000 cc00

解决办法是:

#define Red(x) (((x) & 0xff000000) >> 24)
#define Green(x) (((x) & 0x00ff0000) >> 16)
#define Blue(x) (((x) & 0x0000ff00) >> 8)

使用这个宏会产生

pi3:~/src$ ./a
4 - ffeecc00 - ff ee cc
4 - ffeecc00 - ff ee cc

理应如此。 谢谢你们。

最佳答案

你需要换档和 mask 。也就是说,尝试类似的事情

#define Red(x) (((x) & 0xff000000) >> 24)

对于 Green()Blue() 宏也类似。

(另请注意,为了扩展的安全性,我在宏定义中添加了两对额外的括号。)

关于c - 从 32 位数字中提取字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58895781/

相关文章:

c++ - 在没有源代码的情况下粘合 C 和 C++ 目标文件

c - 如何在 C 中用空字符替换空格和制表符?

java - 如何摆脱 Android Studio 上的可疑调用警告?

casting - 如何克隆一个 Rc 特征对象并将其转换为另一个特征对象?

android - 如何将位图的背景颜色更改为透明且背景不应拖动?

c++ - 位掩码取决于数据类型

C - 在系统函数调用后将 SHELL 输出保存在文件中

c++ - 负的 dwLowDateTime 在 FILETIME 结构中意味着什么?

swift - 将字符串转换为 double 给出 nil

c - C 中的移位和掩码