Я чувствую, что это глупый вопрос, но я не могу заставить его работать, поэтому, пожалуйста, потерпите меня.Я хочу вычислить простую контрольную сумму, чтобы проверить, не повреждены ли (не верны ли) данные, которые я получил по последовательному каналу и сохраненные в QByteArray.
формат пакета данных, которые я получаю, выглядит следующим образом: // Формат пакета: // // | CHAR1 <1> | CHAR2 <1> | CLASS <1> | ID <1> | LENGTH <2> | PAYLOAD | CK_A <1> | CK_B <1> |
// <--------------------- 4 ----------------------------> |
// <--------------------------------------- 6 -----------------------------> |
// <--------------------------------------- 6 + длина --------------------------------> |
// <--------------------------------------------------------- + 8 длина -------------------------------------------> |
Существует две контрольные суммы CK_A и CK_B.Каждый из них имеет длину в один байт. Алгоритм контрольной суммы - это 8-битный алгоритм Флетчера:
CK_A = 0;
CK_B = 0;
for(i=0,i<n,i++){
CK_A = CK_A + Buffer[i];
CK_B = CK_B + CK_A;
}
У меня проблемы с сложением шестнадцатеричных значений, хранящихся в QByteArray.Это код, который я написал. Он рекламирует значения, но они не верны, и код грязный.
for(int I = 4; I < length + 4; I+=2){
tempHex[0] = serialData[I];
tempHex[1] = serialData[I + 1];
tempDec=tempHex.toInt();
CheckSum_A_int = (CheckSum_A_int + tempDec);
CheckSum_A_int &= 0xFF;
CheckSum_B_int = (CheckSum_B_int + CheckSum_A_int);
CheckSum_A_int &= 0xFF;
CK_A = CheckSum_A_int;
CK_B = CheckSum_B_int;
CK_A = CK_A.toLatin1().toHex();
CK_B = CK_B.toLatin1().toHex();
}
Кто-нибудь знает правильный или лучший способ сделать это.Или кто-то может объяснить мне, как шестнадцатеричные значения QByteArray можно добавить?Это образец данных: "b56201241400009b4209d25e02009be0f8ffcc020407140d0000bd33".CK_A должно быть "bd", а CK_B должно быть "33".
Большое спасибо за ваше терпение.Привет