DoYouGot
@DoYouGot

Почему неправильно преобразуется структура?

Почему когда я преобразую из struct my_struct_in в struct my_struct и вывожу, то получается не так как должно, почему там не восемь 0 и что за мусорное значение. Из за чего это ? Знаю что гавнокод но я просто суть хочу понять.
#include <stdio.h>
#include <string.h>

#define AF_INET 1
#define __STRUCTADDR_COMON(sa_prefix) unsigned short int sa_prefix##family

struct my_struct 
{
	__STRUCTADDR_COMON(sa_);
	char data[14];
};

#define my_structContent_size (sizeof(struct my_struct) - sizeof(unsigned short int) - sizeof(unsigned short int) - sizeof(unsigned int))

struct my_struct_in
{
	__STRUCTADDR_COMON(sa_);
	unsigned short int port;
	unsigned long int addr;
	unsigned char sin_zero[my_structContent_size];
};
//base^exp
int power(int base, unsigned int exp)
{
    int i, result = 1;
    for (i = 0; i < exp; i++)
        result *= base;
    return result;
}

void print_byte(unsigned int *value, int col_byte)
{
  unsigned int byte, mask = 0xff*power(256, col_byte-1), shift =  power(256, col_byte-1), byte_itr, bit_itr;
				       //mask *= power(256, col_byte-1);
				       //  shift = power(256, col_byte-1);
  for(byte_itr = 0; byte_itr < col_byte; byte_itr++)
    {
      byte = ((*value) & mask) / shift;
      for(bit_itr = 0; bit_itr < 8; bit_itr++)
	{
	  if(byte & 0x80)
	    printf("1");
	  else
	    printf("0");
	  byte*=2;
	}
      printf(" ");
      shift /= 256;
      mask /=256;
    }
  printf("\n");
}

int main(int argc, char **argv)
{
  struct my_struct_in host_addr;

  host_addr.sa_family = AF_INET;
  host_addr.port = 80;
  host_addr.addr = 1282342;
  memset(&(host_addr.sin_zero), '\0', my_structContent_size);

  struct my_struct *host;
  host = (struct my_struct *)&host_addr;
  unsigned int data;
  for(int i = 0; i < 14; i++)
    {
      data = (host->data[i]);
      print_byte(&data, 1);
    }
  return 0;
}
5c6eddd694e8f702458274.png
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Из за чего это ?

Из-за выравнивания полей данных в структуре и из-за того, что long -- 8 байт. В структуре my_struct_in у тебя идут подряд short, short и long. Первые два short -- выравнены, а чтобы выравнять long компилятор вставил перед ним в структуру дырку длиной в 4 байта. Можно напечатать offsetof(struct my_struct_in, addr) чтобы в этом убедиться.

Что делать? Использовать типы фиксированной ширины (uint32_t addr, если имелся в виду IP адрес). Паковать структуры (если выравнять нельзя), либо располагать поля согласно их натуральному выравниванию.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы