There's no standard way to write to your pre-defined structure. You can use memcpy but that will swap your bytes. However, the most portable way to do it is to shift to each field individually like this:
Code:
#include <stdio.h>
typedef struct
{
unsigned int a : 3; // (0 for data given above)
unsigned int b : 5; // (1 for data given above)
unsigned int c : 12; // (7bc for data given above)
unsigned int d : 12; // (8 for data given above)
} Data;
int main()
{
Data d;
unsigned int i;
unsigned char a[4] = {0x01, 0x7b, 0xc0, 0x08};
i = a[0] << 24 | a[1] << 16 | a[2] << 8 | a[3];
d.a = i >> (32 - 3) & 0x07;
d.b = i >> (32 - 3 - 5) & 0x1f;
d.c = i >> (32 - 3 - 5 - 12) & 0xfff;
d.d = i & 0xfff;
printf("a = %x\nb = %x\nc = %x\nd = %x\n", d.a, d.b, d.c, d.d);
return 0;
}