ทำให้โครงสร้างมีขนาดที่ไม่มีเบาะ [ซ้ำกัน]

ดังนั้น ฉันต้องการที่จะเขียนข้อมูลไบนารี่ในภาษา C ที่สลับกันระหว่างไบต์เดี่ยวและจำนวนเต็มที่ลงนามแบบ 32 บิต และมีประเภทโครงสร้างที่สามารถใช้สำหรับสิ่งนี้โดยเพิ่มตัวชี้

จนถึงตอนนี้นี่คือโครงสร้างของฉัน

struct MarkedInt
{
  unsigned char mark;
  int value;
};

และนี่คือรหัสของฉัน

void clean_obj(struct MarkedInt* mi)
{
  mi->mark = 0;
  mi->value = 0;
}

int main(void) {

  struct MarkedInt a;
  clean_obj(&a);
  a.mark = 5;
  a.value = 500;

  unsigned char* printer = (unsigned char*)(&a);
  printf("sizeof a is %lu\n", sizeof(a));
  for(int i = 0; i< sizeof(a);i++)
  {
    printf("%u\n", printer[i]);
  }
  return 0;
}

แต่ผลลัพธ์ของโปรแกรมก็เป็นเช่นนี้

sizeof a is 8
5
4
64
0
244
1
0
0

ดังนั้นจึงกำหนดขนาดของ struct ของฉัน MarkedInt ที่ 8 ทำให้สมาชิกเครื่องหมายเป็น 4 ไบต์แทนที่จะเป็น 1 ซึ่งทำให้เกิดช่องว่างภายในที่ไม่ต้องการ โดยที่ตัวชี้ไปยังโครงสร้างที่ใช้ในการอ่านข้อมูลไบนารีจะอ่านได้ครั้งละ 8 ไบต์ ไม่ใช่ 5 .

ผลลัพธ์ที่ฉันต้องการคือสิ่งนี้

unsigned char buf[] = {/*mark*/ 5, /*int value*/ 1, 0, 0, 0};
struct MarkedInt* reader = buf;
printf(" mark: %u, value: %d\n", reader->mark, reader->value);

เป็นไปได้ไหมที่จะทำสิ่งนี้ใน c? หรือเพียงแค่อ่านเครื่องหมายไบต์และ int แนะนำให้แยกกัน


person Josh Weinstein    schedule 12.05.2018    source แหล่งที่มา
comment
คุณถามว่า เป็นไปได้ไหมที่จะทำใน C และคำตอบคือ เป็นไปไม่ได้ที่จะทำในภาษา C แต่อาจสามารถทำได้กับส่วนขยายบางอัน และใช่ ดีกว่า วิธีคือการอ่านแยกกัน   -  person Antti Haapala    schedule 12.05.2018