#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <math.h>
#include <inttypes.h>
#define DMP_LLEN 4
#define KNRM "\x1B[0m"
#define KRED "\x1B[31m"
#define KGRN "\x1B[32m"
#define KYEL "\x1B[33m"
#define KBLU "\x1B[34m"
#define KMAG "\x1B[35m"
#define KCYN "\x1B[36m"
#define KWHT "\x1B[37m"
struct inner {
int a;
};
typedef struct test_unpacked_s {
char a;
struct inner b;
} test_unpacked_t;
typedef struct test_packed_s {
char a;
struct inner b;
} __attribute__((__packed__)) test_packed_t;
void hexdump(void *ptr, double len)
{
int i, j;
char *pivot = ptr;
for (i = 0; i < ceil(len / DMP_LLEN); i++) {
printf(" |"KRED" %p "KNRM"| [ ", pivot);
for (j = 0; j < DMP_LLEN; j++) {
printf(KGRN"%02x "KNRM, *pivot++);
}
pivot = pivot - DMP_LLEN;
printf("] --> ");
for (j = 0; j < DMP_LLEN; j++) {
printf(KYEL"[%c]"KNRM, (*pivot == 0x00 ? ' ' : *pivot));
pivot++;
}
printf(" |\n");
}
}
int main(int argc, char *argv[]) {
test_unpacked_t unpacked;
test_packed_t packed;
memset(&unpacked, 0, sizeof(unpacked));
memset(&packed, 0, sizeof(packed));
unpacked.a = 48;
unpacked.b.a = 'X';
packed.a = 48;
packed.b.a = 'X';
printf(" +====================+\n");
printf(" | "KMAG"size unpacked: "KNRM" %lu |\n", sizeof(unpacked));
printf(" | "KMAG"size packed: "KNRM" %lu |\n", sizeof(packed));
printf(" +====================+\n");
printf("\n +====================================+\n");
printf(" | unpacked : %p |\n", &unpacked);
printf(" +====================================+\n");
printf(" | unpacked a : %p |\n", &unpacked.a);
printf(" | unpacked b : %p |\n", &unpacked.b);
printf(" | unpacked b.a : %p |\n", &unpacked.b.a);
printf(" +=====================================\n");
printf("\n +====================================+\n");
printf(" | packed \t: %p |\n", &packed);
printf(" +====================================+\n");
printf(" | packed a \t: %p |\n", &packed.a);
printf(" | packed b \t: %p |\n", &packed.b);
printf(" | packed b.a \t: %p |\n", &packed.b.a);
printf(" =====================================+\n");
printf("\n +===================================================+\n");
printf(KCYN" | hexdump unpacked (%lu bytes):"KNRM" |\n", sizeof(unpacked));
printf(" +===================================================+\n");
hexdump(&unpacked, sizeof(unpacked));
printf(" +===================================================\n");
printf("\n +===================================================+\n");
printf(KCYN" | hexdump packed (%lu bytes):"KNRM" |\n", sizeof(packed));
printf(" +===================================================+\n");
hexdump(&packed, sizeof(packed));
printf(" +===================================================+\n");
return 0;
}