Почему когда я преобразую из 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;
}