Задать вопрос
  • Как преобразовать 1 байт и 0,5 байта в 1,5 байта(Более подробно в описании)?

    @neosapient
    P.S.

    Ещё можно с массивом работать. Т.е. выделить массив длиной 4 байта и обращаться к нему
    #pragma pack(push,1)
    union int_t{
      int value;
      unsigned char arr[4];
    };
    #pragma pack(pop)
    ....
    int_t obj;
    obj.value = 2016;
    printf("%.2X%.2X", obj.arr[1], obj.arr[0]);
  • Как преобразовать 1 байт и 0,5 байта в 1,5 байта(Более подробно в описании)?

    @neosapient
    #pragma pack(push,1)
    union int_t{
      int value;
      struct {
        unsigned char b1;
        unsigned char b2;
        unsigned char b3;
        unsigned char b4;
      };
    };
    #pragma pack(pop)
    
    int main(int argc, char* argv[])
    {
    	int_t obj;
    	obj.value = 2016;
    	printf("%.8X", obj.value);
    	printf("\n");
    	printf("%.2X%.2X%.2X%.2X", obj.b4, obj.b3, obj.b2, obj.b1);
    	return 0;
    }


    На выходе увидете

    000007E0
    000007E0

    Суть идеи, что длина объединения зависит от длинны наибольшего объекта. В данном случае int - 4 байта, и структура - 4 раза по байту.
    Т.е. память выделяется на 4 байта, а дальше вы можете обращаться либо к value, либо к каждому байту отдельно.
    Собственно при распечатке, вы обращаетесь в первый раз к инту, а второй раз последовательно ко всем 4-м байтам.
    К слову, заметте порядок обращения ко всем четырем байтам: 4-3-2-1.
    Вполне показательный пример получлся: в b1 хранится значение E0, а в b2 храниться 07

    Успехов!