Reading Serial Data into a byte array results in invalid data being received

I was thinking the invalid data may be do to a timing issue from the arduino reading usart faster than bytes arrive

This is usually the case. But the result is not that Serial.read() returns garbage. Instead it will return -1, meaning that at the time it was called no new (complete) byte had entered the "system" receive ring buffer since its previous call.