C++ 十六进制格式字符串
C++ hex format string
Create
方法应该生成一个由 9 个字符组成的字符串,其组成如下:
som
后跟 id
字符加上 4 个字符(代表 value
的十六进制字符串)加上 2 个字符(代表 crc 的十六进制字符串)加上 eom 字符。
这是代码:
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&
在 C++ 中使用 std::setw
和 std::setfill
。
记得保存和恢复 iomanip 标志。
string epilogue(string data) {
ostringstream _message;
if (crc) {
byte _sum = checksum(data);
const auto save = _message.flags();
_message << std::hex << std::setw(2)
<< std::setfill('0') << (_sum & 0xFF);
_message.flags(save);
}
_message << eom;
return _message.str();
}
string Create(char id, short value) {
ostringstream _message, _data;
const auto save = _data.flags();
_data << std::hex << std::setw(4)
<< std::setfill('0') << (value & 0xFFFF);
_message.flags(save);
_message << som << id << _data.str() << epilogue(_data.str());
return _message.str();
}
:
format("%02X",
^ std::hex << std::uppercase
^ std::setw(2)
^ std::setfill('0')
Create
方法应该生成一个由 9 个字符组成的字符串,其组成如下:
som
后跟 id
字符加上 4 个字符(代表 value
的十六进制字符串)加上 2 个字符(代表 crc 的十六进制字符串)加上 eom 字符。
这是代码:
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&
在 C++ 中使用 std::setw
和 std::setfill
。
记得保存和恢复 iomanip 标志。
string epilogue(string data) {
ostringstream _message;
if (crc) {
byte _sum = checksum(data);
const auto save = _message.flags();
_message << std::hex << std::setw(2)
<< std::setfill('0') << (_sum & 0xFF);
_message.flags(save);
}
_message << eom;
return _message.str();
}
string Create(char id, short value) {
ostringstream _message, _data;
const auto save = _data.flags();
_data << std::hex << std::setw(4)
<< std::setfill('0') << (value & 0xFFFF);
_message.flags(save);
_message << som << id << _data.str() << epilogue(_data.str());
return _message.str();
}
:
format("%02X",
^ std::hex << std::uppercase
^ std::setw(2)
^ std::setfill('0')