C ++十六进制格式字符串

问题描述 投票:0回答:1

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);

可以正确输出十六进制字符串,但长度不能为correct。类似的问题应该在该行中:

_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;
}

Online code

预期结果是:

$C0000c0&
c++ formatting hex
1个回答
1
投票

在C ++中使用std::setwstd::setfill

记住要保存和恢复iomanip标志。

© www.soinside.com 2019 - 2024. All rights reserved.