Arduino 在 uint32_t 和无符号字符之间转换

Posted

技术标签:

【中文标题】Arduino 在 uint32_t 和无符号字符之间转换【英文标题】:Arduino converting between uint32_t and unsigned chars 【发布时间】:2013-02-26 19:58:53 【问题描述】:

我使用的是 rainbowduino,它有一些方法可以将单个 r g b 值作为无符号字符,还有一些方法采用 24 位 rgb 颜色代码。

我想将 r g b 值转换为 uint32_t 类型的 24 位颜色代码(这样我的所有代码都只需要使用 r g b 值。

有什么想法吗?

我已经尝试过 uint32_t result = r

Rb.setPixelXY(unsigned char x, unsigned char y, unsigned char colorR, unsigned char colorG, unsigned char colorB)
This sets the pixel(x,y)by specifying each channel(color) with 8bit number.

Rb.setPixelXY(unsigned char x, unsigned char y, unit32_t colorRGB) 
This sets the pixel(x,y)by specifying a 24bit RGB color code.

【问题讨论】:

【参考方案1】:

驱动代码是:

void Rainbowduino::setPixelXY(unsigned char x, unsigned char y, uint32_t colorRGB /*24-bit RGB Color*/)

    if(x > 7 || y > 7)
    
     // Do nothing.
     // This check is used to avoid writing to out-of-bound pixels by graphics function. 
     // But this might slow down setting pixels (remove this check if fast disply is desired)
    
    else
    
    colorRGB = (colorRGB & 0x00FFFFFF);
    frameBuffer[0][x][y]=(colorRGB & 0x0000FF); //channel Blue
    colorRGB = (colorRGB >> 8);
    frameBuffer[1][x][y]=(colorRGB & 0x0000FF); //channel Green
    colorRGB = (colorRGB >> 8);
    frameBuffer[2][x][y]=(colorRGB & 0x0000FF); //channel Red
    

所以我会认为类似于上面的:

uint8_t x,y,r,b,g;
uint32_t result = (r << 16) | (g << 8) | b;
Rb.setPixelXY(x, y, result); 

应该可以。我认为上面可能需要括号,以确保正确排序,因为“+”高于“

附:请记住,当移位为无符号时,除非您想要算术移位与逻辑移位。 在这点上,我不喜欢轮班,因为它们经常混乱且效率低下。相反,联合是简单而高效的。

union rgb 
  uint32_t word;
  uint8_t  byte[3];
  struct 
    uint8_t  blue;
    uint8_t  green;
    uint8_t  red;
   color ;
rgb ;

// one way to assign by discrete names.
rbg.color.blue = b;
rbg.color.green = g;
rbg.color.red = r;
//or assign using array
rgb.byte[0] = b;
rgb.byte[1] = g;
rgb.byte[2] = r;
// then interchangeably use the whole integer word when desired.
Rb.setPixelXY(x, y, rgb.word); 

不要搞乱跟踪班次。

【讨论】:

【参考方案2】:

解决此问题的一种方法是将位向左移动...

uint32_t result = r << 16 + g << 8 + b;

【讨论】:

试过了,好像不行,不知道为什么。当给 uint32_t 方法 0xFF0000 时,我得到红色,0x00FF00 绿色,0x0000FF 蓝色,但执行上述操作似乎不起作用

以上是关于Arduino 在 uint32_t 和无符号字符之间转换的主要内容,如果未能解决你的问题,请参考以下文章

uint8_t 与无符号字符

uint8_t 数据类型

动态整数大小:int64_t、int32_t、uint32_t 等

如何将 32 字符(0/1)的序列转换为 32 位(uint32_t)?

如何将字符串转换为 uint32_t [重复]

使用多个 uint32_t 整数生成 uint64_t 哈希键