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



我有一项任务,要求我在图片文件中读取每个像素的uint32_t变量(3个字节用于颜色,1个字节用于饱和度(。然后我应该用各种方式过滤图片,比如红色过滤器,将所有蓝色和绿色字节设置为0。我正在努力弄清楚如何更改uint32_t变量中的4个单独字节。

带位移位:

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%xn", pixel); /* --> 0x4030201 */

使用联合:

typedef union pixel_s {
uint32_t uint32_value;
uint8_t uint8_value[4]; 
} pixel_t;
pixel_t pixel;
uint8_t byte0 = 1, byte1 = 2, byte2 = 3, byte3 = 4;
pixel.uint8_value[0] = byte0;
pixel.uint8_value[1] = byte1;
pixel.uint8_value[2] = byte2;
pixel.uint8_value[3] = byte3;
printf("0x%xn", pixel.uint32_value); /* --> 0x4030201 */

正如其他人提到的,这取决于机器。但很可能您使用的是x86或x86_64,所以它将是小端序。上面的代码是针对little-endian的。

这个流行的答案描述了如何修改单个位。从那里,您可以将其扩展为对一个字节(8位(进行操作。既然这是家庭作业,我不想完全为你回答,但如果你仍然不能得到它,请回复。

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

#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))将新值设置在正确的位置。最后,我们用新值逻辑地或位掩码。

最新更新