QByteArray ist verwirrenderweise ein Array von char und sollte deswegen
eigentlich QCharArray heißen. Ein char kann in C++ signed oder unsigned
sein, bei dem von dir verwendeten Compiler ist es offensichtlich signed.
Du möchtest aber die gelesenen Bytes mit Unsigned-Arithmetik
weiterverarbeiten. Das tust du am besten dadurch, dass du sie gleich
beim Lesen mit at() in ein unsigned char castest:
1 | static_cast<unsigned char>read_data.at(...)
|
Dann funktionieren sowohl dein als auch Karl Heinz' Code.
Und schick den Qt-lern gleich einen Bug-Report: 99% aller Programmierer
denken bei "Byte" an eine vorzeichenlose Zahl oder zumindest an eine
Zahl, die definiert vorzeichenlos oder vorzeichenbehaftet ist. Zudem
sollte der Typ char nur für Textzeichen bzw. in unicode-fähiger Software
überhaupt nicht verwendet werden. Und für Arrays von Unicode-Zeichen
gibt es in Qt die Klasse QString, weswegen QByteArray nie für Texte
verwendet werden sollte. Richtig wäre es somit, QByteArray auf Basis von
unsigned char anstelle von char zu deklarieren.