Метод Create
должен создать строку из 9 символов, составленную таким образом: som
, за которой следует id
символ плюс 4 символа (шестнадцатеричная строка, представляющая value
) плюс 2 символа (шестнадцатеричная строка, представляющая cr * 1028) *) плюс EOM Char. Это код:
private:
char som = '$';
char eom = '&';
bool crc = true;
unsigned char checksum(string data) {
unsigned char sum = 0x00;
for (char &c : data)
sum += c;
return sum;
}
string epilogue(string data) {
ostringstream _message;
if (crc) {
byte _sum = checksum(data);
_message << std::hex << (_sum & 0xFF);
}
_message << eom;
return _message.str();
}
string Create(char id, short value) {
ostringstream _message, _data;
_data << std::hex << (value & 0xFFFF);
_message << som << id << _data.str() << epilogue(_data.str());
return _message.str();
}
Проблема в этой строке:
_data << std::hex << (value & 0xFFFF);
, которая правильно выводит шестнадцатеричную строку, но не имеет правильной длины. Аналогичная проблема должна быть в строке:
_message << std::hex << (_sum & 0xFF);
Как я могу исправить этот код, чтобы получить именно тот шаблон, который мне нужен? В Java я использовал что-то вроде этого:
String.format("%02X", value & 0xFFFF)
РЕДАКТИРОВАТЬ (исполняемый код):
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
typedef unsigned char byte;
class PacketBuilder {
private:
char som = '$';
char eom = '&';
bool crc = true;
public:
PacketBuilder(const char som, const char eom, bool crc) {
this->som = som;
this->eom = eom;
this->crc = crc;
}
byte checksum(string data) {
byte sum = 0x00;
for (char &c : data)
sum += c;
return sum;
}
string epilogue(string data) {
ostringstream _message;
if (crc) {
byte _sum = checksum(data);
_message << std::hex << (_sum & 0xFF);
}
_message << eom;
return _message.str();
}
string Create(char id, short value) {
ostringstream _message, _data;
_data << std::hex << (value & 0xFFFF);
_message << som << id << _data.str() << epilogue(_data.str());
return _message.str();
}
};
int main() {
PacketBuilder* _pb = new PacketBuilder('$','&',true);
string _packet = _pb->Create('C',0);
cout << _packet;
return 0;
}
Онлайн-код
Ожидается результат:
$C0000c0&