On Thu, 8 Apr 2010, Michael Davidson wrote:
Your modern compiler is almost certainly inserting two
bytes of padding
after ar_name[]
so that the int32_t ar_date is aligned on a 4 byte boundary - that shifts
everything else
down by 2 bytes and means that ar_size lines up with the last 2 bytes of the
size in
the header which, as luck would have it, is the low order 16 bits of the
size as it would
have been stored in a 32 bit long.
Something like this should work on a modern little endian processor"
struct {
char ar_name[14];
int16_t ar_date_16_31;
int16_t ar_date_00_15;
char ar_uid;
char ar_gid;
uint16_t ar_mode;
uint16_t ar_size_16_31;
uint16_t ar_size_00_15;
} ar_buf;
Thank you! That works for me! I can now get correct sizes, names, and
data. I will clean up my little ar extractor over the next few days and
share it.