从 32 位数字中提取字节
Extracting bytes from a 32 bits number
这不重要,应该很简单,我只是不明白我做错了什么。
这背后的故事是我在 attiny85 上玩 tinyNeoPixel lib,我想比我需要的更深入。
这是传统的 ANSI C,我在这个测试中使用了 Raspberry Pi3,但对于这种情况,这应该是无关紧要的。 printf 上的 sizeof(c) 只是显示 'c' 是 4 个字节,正如预期的那样。
我正在尝试提取存储为 32 位数字的颜色的红色、绿色和蓝色部分
显然我无法将结果 return 作为 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
这是应该的。
谢谢大家。
你需要移动和掩码。也就是说,尝试类似
#define Red(x) (((x) & 0xff000000) >> 24)
您的 Green()
和 Blue()
宏也是如此。
(另请注意,为了扩展安全,我在宏定义中添加了两对额外的括号。)
这不重要,应该很简单,我只是不明白我做错了什么。 这背后的故事是我在 attiny85 上玩 tinyNeoPixel lib,我想比我需要的更深入。
这是传统的 ANSI C,我在这个测试中使用了 Raspberry Pi3,但对于这种情况,这应该是无关紧要的。 printf 上的 sizeof(c) 只是显示 'c' 是 4 个字节,正如预期的那样。
我正在尝试提取存储为 32 位数字的颜色的红色、绿色和蓝色部分
显然我无法将结果 return 作为 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
这是应该的。 谢谢大家。
你需要移动和掩码。也就是说,尝试类似
#define Red(x) (((x) & 0xff000000) >> 24)
您的 Green()
和 Blue()
宏也是如此。
(另请注意,为了扩展安全,我在宏定义中添加了两对额外的括号。)