OK, so after playing around with this for a bit, I ended up with the concatenation loop sometimes putting an invalid character at the beginning of the string. I have no idea why it works, but if I put a delayMicroseconds(1); in between the command
=inByte: and the c++; lines, it goes away.
It started almost right after I posted the code (I blame Murphy), and to track down where the problem was I added lines of client.print(x) at various places to give me some idea where things were going wrong. Then I couldn't get it to fail, so I started taking the lines back out and this location was the only place that made any difference (take it out, it won't work; put it back, it does)! So I tried a delay(1) in it's place and it worked, then tried the delayMicrosecond() and whittled it down to just 1 microsecond and it still works. Since that is essentially only delaying the program about 16 clock cycles at this point, I can live with that.