Bitshifting bytes to form a long var fails!

byte str4 = (Start & 0xF000) >> 12;

Not very efficient:

byte str4 = (Start >> 12) & 0x0f;
address = long (a) << 16 | long (b) << 12 | c << 8 | d << 4 | e;

Try this:

address = ((unsigned long) a << 16) | ((unsigned long) b << 12) | (c << 8) | (d << 4) | e;

assuming a/b/../e are bytes.