如何从存储在 QByteArray 中的十六进制值计算校验和
How can you calculate a checksum from hex values stored in a QByteArray
我觉得这是一个愚蠢的问题,但我无法让它工作,所以请耐心等待。 我想计算一个简单的校验和,以检查我通过串行接收并存储在 QByteArray 中的数据是否未损坏(或正确(。
我收到的数据的数据包格式是这样的: 数据包格式:////|字符1<1>|字符2<1>|类<1>|ID<1>|长度<2>|有效载荷|CK_A<1>|CK_B<1>|
<--------------------->|
<--------------------------------------->|
<--------------------------------------->|
//<---------------------------------------------------------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"。
非常感谢您的耐心等待。 问候
根据 ublox 数据表,您的校验和计算从错误的偏移量开始并过早停止,并且每个循环添加两个数据字节而不是一个。以下示例根据示例数据计算正确的校验和 A 和 B。
#include <QByteArray>
#include <iostream>
int main(int argc, char *argv[])
{
// Unused function parameters
(void)argc;
(void)argv;
uint16_t csum_a = 0;
uint16_t csum_b = 0;
QByteArray ba;
// Example Receive message
uint8_t data[] = {
0xb5, 0x62, // Preamble
0x01, 0x24, // CLASS + ID
0x14, 0x00, // Length (Little Endian)
0x00, 0x9b, 0x42, 0x09, // Payload
0xd2, 0x5e, 0x02, 0x00, // Payload
0x9b, 0xe0, 0xf8, 0xff, // Payload
0xcc, 0x02, 0x04, 0x07, // Payload
0x14, 0x0d, 0x00, 0x00, // Payload
0xbd, // Checksum A
0x33 // Checksum B
};
// Add receive message to QByteArray
for (int i = 0; i < static_cast<int>(sizeof(data)); i++)
{
ba.append(static_cast<int8_t>(data[i]));
}
std::cout << "QByteArray size: " << ba.size() << std::endl;
// Extract length from receive message
// According to ublox datasheet, it's little endian.
uint16_t length = static_cast<uint16_t>(ba[4]) | static_cast<uint16_t>((ba[5]) << 8);
std::cout << "Message length: " << length << std::endl;
// Calculate checksum according to ublox datasheet.
// The checksum is calculated over the Message, starting and including
// the CLASS field, up until, but excluding, the Checksum Field.
for (uint16_t offset = 2; offset < (length + 6); offset++)
{
csum_a = (csum_a + ba[offset]) & 0x00ff;
csum_b = (csum_b + csum_a) & 0x00ff;
}
std::cout << "Checksum A: " << std::hex << "0x" << csum_a << std::endl;
std::cout << "Checksum B: " << std::hex << "0x" << csum_b << std::endl;
return 0;
}
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 指向存储在字符串 c++ 中的十六进制
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C ++如何使用UTF8十六进制代码打印UTF8符号?
- 如何从存储在 QByteArray 中的十六进制值计算校验和
- 计算 RSA 并以十六进制格式保存到文件
- 如何从 IP 校验和字段中计算十六进制值
- 手动将二进制表达式计算为十六进制
- 努力理解一个以十六进制、十进制、bin 和 dec 计算数字总和的程序
- 如何用预先计算的十六进制值初始化双数组
- 计算字符串/数组元素的十六进制,然后将其转换为十进制
- 计算十六进制数的位数
- 如何计算二进制SHA256哈希为给定的十六进制数据在c++