如何更改uint32_t变量中单个字节的值?

我有一项作业,要求我读取图片文件作为每个像素的uint32_t变量(3个字节表示颜色,1个字节表示饱和度)。然后,我应该以各种方式对图片进行过滤,例如将红色的所有蓝色和绿色字节都设置为0的红色过滤器。我正在努力找出如何更改uint32_t变量中的4个单独的字节。 / p>

shen774013972 回答:如何更改uint32_t变量中单个字节的值?

This popular answer describes how to modify a single bit.从那里,您可以扩展它以对一个字节(8位)进行操作。由于这是家庭作业,因此我不想为您完全回答它,但是如果您仍然无法获得它,请回击。

,

有位移:

uint32_t pixel = 0;
uint8_t byte0 = 1,byte1 = 2,byte2 = 3,byte3 = 4;

pixel = (pixel & 0xFFFFFF00) |  byte0;
pixel = (pixel & 0xFFFF00FF) | ((uint32_t)byte1 <<  8);
pixel = (pixel & 0xFF00FFFF) | ((uint32_t)byte2 << 16);
pixel = (pixel & 0x00FFFFFF) | ((uint32_t)byte3 << 24);

printf("0x%x\n",pixel); /* --> 0x4030201 */

使用工会:

typedef union pixel_s {
    uint32_t uint32_value;
    uint8_t uint8_value[4]; 
} pixel_t;

pixel_t pixel;
uint8_t byte0 = 1,byte3 = 4;

pixel.uint8_value[0] = byte0;
pixel.uint8_value[1] = byte1;
pixel.uint8_value[2] = byte2;
pixel.uint8_value[3] = byte3;

printf("0x%x\n",pixel.uint32_value); /* --> 0x4030201 */

正如其他人提到的,这取决于机器。但是很可能您使用的是x86或x86_64,因此它的字节序很少。上面的代码用于小尾数法。

,

您还可以使用预处理宏来修改变量中的某个字节。也许它为您提供了更灵活的解决方案。

#define SET_BYTE(INPUT,VALUE,POSITION)   (INPUT=(VALUE<<(POSITION<<3))|(INPUT&(0xFFFFFFFF^(0xFF<<(POSITION<<3)))))

其中INPUT是您要修改的数据,VALUE是新值,POSITION是该值的字节位置。

用法:

unsigned long data = 0xFFFFFFFF;
SET_BYTE(data,0xAA,2); /* set 0xAA to byte position 2; data = 0xFFAAFFFFFF */

很可能我的定义似乎有点混乱,但是会发生以下情况: 宏的(INPUT&(0xFFFFFFFF^(0xFF<<(POSITION<<3))))部分在正确的字节位置上创建0x00位掩码,并清除该字节。然后(VALUE<<(POSITION<<3))在正确的位置设置新值。最后,我们在逻辑上使用新值或位掩码。

本文链接:https://www.f2er.com/3055576.html

大家都在问