Preamble:
It is generally not recommended to need to know a fixed size for your structs. It is advised to use operators like sizeof to adapt to the relevant conditions. If you can avoid needing it, do so.
Answer:
There's a few things to consider. First off, the primitive types, char, int, long, long long are not fixed width. By making the fields of your struct types like char and unsigned long long you're already kinda saying in your code that they do not need to be a specific size. char is *at least* a byte. int is *at least* 2 bytes, long is *at least* 4 and long long is *at least* 8. But all of these are specified as "at least". Instead use types like uint64_t to be more exact.
Second, if the fields of your struct don't conform to architecture alignment it may be padded for optimisation. Padding can happen in between fields and at the end. For example, your chars may get an additional 7 bytes of padding if the architecture and compiler in question really like things to be 64-bit aligned. To avoid this, you can use the compiler directive of "packed". You put this right after your struct keyword as such
Code:
typedef struct __attribute__((packed)) {
If I am not mistaken and missing something, both of these together should ensure the size of your struct is maintained exactly across architectures. Note however that the __attribute__((packed)) may not function on all compilers, but should work fine on Apple Clang used by Xcode's toolchain - at least last I tried