Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从32位数字中提取字节_C_Casting_Bitmask - Fatal编程技术网

C 从32位数字中提取字节

C 从32位数字中提取字节,c,casting,bitmask,C,Casting,Bitmask,这并不重要,应该很简单,我只是不明白我做错了什么。 这背后的故事是,我在attiny85上玩tinyNeoPixel lib,我试图潜得比我需要的更深一点 这是传统的ANSIC,我在这个测试中使用了覆盆子Pi3,但对于这个例子来说,这应该是无关的。printf上的sizeof(c)只显示了“c”是4个字节,正如预期的那样 我试图提取颜色的红色、绿色和蓝色部分,这些部分存储为32位数字 很明显,我没有以1字节的值返回结果,同一个值能告诉我怎么做吗?仅将其转换为(uint8_t)只会产生零 多谢各位

这并不重要,应该很简单,我只是不明白我做错了什么。 这背后的故事是,我在attiny85上玩tinyNeoPixel lib,我试图潜得比我需要的更深一点

这是传统的ANSIC,我在这个测试中使用了覆盆子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
使用此宏,将生成

pi3:~/src$ ./a
4 - ffeecc00 - ff ee cc
4 - ffeecc00 - ff ee cc
应该如此。
谢谢大家。

你们不仅需要面具,还需要变换姿势。也就是说,尝试类似的方法

#define Red(x) (((x) & 0xff000000) >> 24)
同样,对于
Green()
Blue()


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

看起来您可能需要移位和掩码。也就是说,尝试类似于
#定义红色(x)((x)&0xff000000)>>24)
的方法。移动24位表示红色,16位表示绿色,8位表示蓝色,现在每个宏返回一个8位值。谢谢你,你应该回答这个问题。OP-欢迎来到SO。当史蒂夫回答这个问题时,你应该接受它(或者如果它更适合你的话,你应该接受另一个答案)
sizeof
返回一个
size\u t
值,在@phuclv中,sizeof值是用%d而不是%x打印的,作为一个未签名值,它应该用%u打印。我不太清楚z在那里做什么。
#define Red(x) (((x) & 0xff000000) >> 24)