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.