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 адрес). Паковать структуры (если выравнять нельзя), либо располагать поля согласно их натуральному выравниванию.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы