gpt4 book ai didi

c - 如何访问整数形式的字节

转载 作者:行者123 更新时间:2023-11-30 19:50:54 25 4
gpt4 key购买 nike

我正在尝试在 .bmp 文件中的像素字节(或八位字节)与随机生成的整数中的 3 个字节之间进行异或 排除最重要的一个。我有点理解,最高有效字节取决于字节顺序,通常它是句子中传输的第一个字节。在 pix 数组中,我存储了每个像素的每个八位字节。wh 都等于 800,并且是 .bmp 图片的尺寸 (800 x 800) R 是一个随机数数组。

我尝试执行以下操作,但在一些增量后它会给我一个段错误

unsigned char *pix = malloc((3 * w * h) * sizeof(unsigned char));

for(int i = 0; i < (3 * w * h); i++)
fread(&pix[i], sizeof(char), 1, fin);

uint32_t *R = malloc((3 * ((2 * w * h) - 1)) * sizeof(uint32_t));
unsigned char bytes[4];

for(k = 0; k < (3 * w * h); k = k + 3)
{
bytes[0] = (R[3 * w * h + k] >> 24) & 0xFF;
bytes[1] = (R[3 * w * h + k] >> 16) & 0xFF;
bytes[2] = (R[3 * w * h + k] >> 8) & 0xFF;
bytes[3] = R[3 * w * h + k] & 0xFF;

ch[k] = bytes[1] ^ pix[k];
ch[k + 1] = bytes[2] ^ pix[k + 1];
ch[k + 2] = bytes[3] ^ pix[k + 2]
}

最佳答案

typedef enum
{
LITTLE = 0xff000000,
BIG = 0x000000ff,
}ENDIANESS;

static ENDIANESS endianess;

ENDIANESS DetectEndianess(void)
{
union
{
uint8_t u8[sizeof(unsigned int)];
unsigned int u;
}udata = {.u = 0xff};

return (endianess = (udata.u8[0] == 0xff ? LITTLE : BIG));
}

static inline ENDIANESS GetEndianess(void)
{
return endianess;
}

uint32_t GetUint32FromRGB(uint8_t *ptr)
{
union u32u
{
uint8_t u8[4];
uint32_t u32;
}union32 = (GetEndianess() == LITTLE ? (union u32u){.u8[0] = *ptr, .u8[1] = *(ptr + 1), .u8[2] = *(ptr + 2)} : (union u32u){.u8[2] = *ptr, .u8[1] = *(ptr + 1), .u8[0] = *(ptr + 2)});

return union32.u32 & GetEndianess();
}

uint32_t Xor3LowerBytes(uint32_t a, uint32_t b)
{
return (a & GetEndianess()) ^ (b & GetEndianess());
}
<小时/>

或者,如果您不关心字节序(在本例中为“小”)

uint32_t Xor3lowerBytes(void *ptr, uint32_t value)
{
uint32_t *u32 = ptr;

return (*u32 & 0xff000000) ^ value;
}

关于c - 如何访问整数形式的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53944148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com