Ваш unsigned char
имеет ширину в один байт, поэтому "00000001"
будет иметь значение 3030303031
в шестнадцатеричном формате, поскольку код ASCII для '0'
равен 0x30
в шестнадцатеричном формате, а ASCII для '1'
равен 0x31
.
Ваш int
имеет ширину 4 байта, поэтому он будет захватывать первые 4 байта data
, которые будут 30303030
в шестнадцатеричном или 808464432
в десятичном виде.
Это, однако, будет работать на машине с прямым порядком байтов:
#include <stdio.h>
typedef struct mystruct {
int a;
int b;
int c;
int d;
} mystruct;
unsigned char *data = "\1\0\0\0"; // use octal numbers, not ASCII, also note the reversed order
int main(void) {
mystruct *ms = (mystruct *)data;
printf("%i", ms->a); // outputs: 1
}