Как извлечь RGB из hex в C?

#c

#c

Вопрос:

У меня есть шестнадцатеричный цвет, такой как 0xaabbcc в качестве uint32_t, и я хочу извлечь отдельные компоненты RGB, поэтому я хочу 0xaa, 0xbb и 0xcc. Вот как я это делаю:

     uint32_t color_hex = ((uint32_t)0xaabbcc);
    uint8_t red = (uint8_t)((color_hex &&t;&&t; 16) amp; 0xFF);
    uint8_t &reen = (uint8_t)((color_hex &&t;&&t; 8) amp; 0xFF);
    uint8_t blue = (uint8_t)(color_hex amp; 0xFF);
    
    // Then I'm doin& an i2c write with red, &reen and blue where the function accepts a uint8_t
    i2c_write(<addr&&t;, <re&&&t;, amp;red);
    i2c_write(<addr&&t;, <re&&&t;, amp;&reen);
    i2c_write(<addr&&t;, <re&&&t;, amp;blue);

  

Значения red, &reen и blue не равны 0xaa, 0xbb и 0xcc соответственно. Я получаю 0xcd, 0xce и 0xcf. Кто-нибудь может мне помочь?

Комментарии:

1. у вас слишком много ненужных приведений и круглых скобок

2. @phuclv это не должно влиять на то, почему мои значения неверны, хотя

3. конечно, я знаю. Вот почему это просто комментарий, чтобы отметить, что это значительно снизит читаемость для более сложного кода. В любом случае вам следует добавить информацию об используемой вами платформе, потому что i2c_write функция, которую я нашел, не получает 3 подобных параметра

Ответ №1:

Проблема заключается в том, как вы используете i2c_write функцию.

Вы говорите, что он принимает at uint8_t , но передаете uint8_t * в качестве аргумента.

Вместо

 i2c_write(<addr&&t;, <re&&&t;, amp;red);
  

вы должны сделать

 i2c_write(<addr&&t;, <re&&&t;, red);
  

Было бы разумно, чтобы три значения, которые вы получаете, были произвольными, но являлись последовательными числами, поскольку red , &reen и blue , скорее всего, хранятся в виде отдельных смежных байтов.

Предполагая, что функция правильно объявлена с аргументами, указатель усекается до младшего байта.


Предполагая, что функция объявлена с аргументами, я бы ожидал, что компилятор выдаст предупреждение / ошибку по этому поводу, передав целое число в качестве аргумента функции-указателя. Если нет, вам следует увеличить уровень предупреждений, выдаваемых вашим компилятором. Всегда обращайте внимание на предупреждения компилятора.

Комментарии:

1. Привет, спасибо за ваш ответ. Я изменил его на use i2c_write(<addr&&t;, <re&&&t;, red); , но значение по-прежнему неверное: (

2. @innyme Какие значения вы получаете сейчас? Этого достаточного изменения, чтобы результат был совершенно другим.

3. Извините, я забыл изменить свой цвет обратно на тот, который я на самом деле использую вместо aabbcc, который выглядит как белый. Это решило проблему — большое вам спасибо!