Как я могу получить доступ к байтам из целого числа? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь сделать xor между байтами (или октетами) пикселя из файла .bmp и 3 байтами из случайно сгенерированного целого числа , исключая самое старшее .Я вроде понимаю, что самый значимый байт зависит от порядка байтов и, как правило, это первый передаваемый в предложении.В массиве pix я сохранил каждый октет каждого пикселя.w и h равны 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]
}

1 Ответ

0 голосов
/ 27 декабря 2018
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());
}

Или, если вас не волнует абсолютная бесконечность (в данном примере LITTLE)

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

    return (*u32 & 0xff000000) ^ value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...