воскресенье, 1 декабря 2013 г.

C++. Intel hex. Checksum calculation

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <cstdint>

using namespace std;

vector<size_t> hexToNumBS(const string &srcStr) {

    vector<size_t> v;

    if ( srcStr.size() < 2 ) {
        return v;
    }

    stringstream ss;
    size_t code = 0;

    for ( size_t i=1; i<srcStr.size(); i+=2 ) {

        ss << hex << srcStr.substr(i-1, 2);
        ss >> code;
        v.push_back(code);

        ss.clear();
    }

    return v;
}

string checksum(const string &str) {

    vector<size_t> v = hexToNumBS(str);
    u_int8_t cs = 0;

    for ( size_t i=0; i<v.size(); i++ ) {
        cs -= v[i];
    }

    stringstream ss;
    ss << hex << static_cast<size_t>(cs);

    string ret;
    ss >> ret;

    if ( ret.size() < 2 ) {
        ret = "0" + ret;
    }
    else if ( ret.size() > 2 ) {
        return "";
    }

    transform(ret.begin(), ret.end(), ret.begin(), ::toupper);

    return ret;
}

int main() {

    string fullOrigStr("102AE0007C0803A6382100084E8000209421FFE8CE");
    cout << "Full original string:              "
         << fullOrigStr << "\n";

    string origStr = fullOrigStr.substr(0, fullOrigStr.size()-2);
    cout << "Original string w/o checksum byte: " << origStr << "\n";

    cout << "Calculated checksum:               "
         << checksum(origStr) << "\n";

    return 0;
}

Комментариев нет:

Отправить комментарий