checksums are simply additive
This commit is contained in:
parent
258910efe1
commit
7e4734f56a
|
@ -186,7 +186,7 @@ void Message::write(std::vector<uint8_t> &buffer) const
|
|||
writeType(buffer, mdb.pid);
|
||||
buffer.push_back(mdb.pdl());
|
||||
buffer.insert(buffer.end(), mdb.pd.begin(), mdb.pd.end());
|
||||
writeType(buffer, checksum());
|
||||
writeType(buffer, checksum(buffer));
|
||||
}
|
||||
|
||||
|
||||
|
@ -278,7 +278,7 @@ uint16_t Message::checksum(std::vector<uint8_t> data)
|
|||
{
|
||||
uint16_t sum = 0;
|
||||
for (const auto &byte : data)
|
||||
addSum_(sum, byte);
|
||||
sum += byte;
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
|
|
@ -146,19 +146,9 @@ private: // templates
|
|||
template<typename T>
|
||||
static void addSum_(uint16_t &sum, const T &val)
|
||||
{
|
||||
uint8_t byte;
|
||||
uint16_t carry;
|
||||
auto data = reinterpret_cast<const uint8_t*>(&val);
|
||||
for (int i = 0; i < sizeof(T); i++)
|
||||
{
|
||||
byte = data[sizeof(T)-1-i];
|
||||
while (byte != 0)
|
||||
{
|
||||
carry = sum & byte;
|
||||
sum = sum ^ byte;
|
||||
byte = carry << 1;
|
||||
}
|
||||
}
|
||||
sum += data[sizeof(T)-1-i];
|
||||
}
|
||||
|
||||
}; // struct Message
|
||||
|
|
Loading…
Reference in New Issue