Bruno
Bruno

Reputation: 37

create and display hexadecimal string in c++

I've been reading many suggestions on the same topic, and tried to implement many of them, but it seems that none of them is actually working in my environment. I'm using QT 5, but I think the problem is not related to QT but to how the hexadecimal character 0x00 is interpreted by the language. What I have to achieve is to display a stream of unsigned char as hexadecimal values, eg:

Input bytes: 0x00 0x4E 0x01 0x00 0x17 0x00

Display as: 0x00:0x4E:0x01:0x00:0x17:0x00

it seems quite easy, but all I get is an empty string...

The functions I wrote:

QString getBufferAsHexStr(const unsigned char* buf, int buffsize) {
std::string finalstring("");
char tempbuff[5];
int n=0, index=0;
for (int c = 0; c < buffsize; c++) {
    if(c == buffsize-1) {
        n=sprintf(tempbuff, "0x%02X", buf[c]);
    } else {
        n=sprintf(tempbuff, "0x%02X:", buf[c]);
    }
    finalstring.append(tempbuff, n);
    index += n;
}
QString resultStr(finalstring.c_str());
return resultStr;
}

QString getBufferAsHexStr(const unsigned char* buf, int buffsize) {
std::stringstream ss;
for (int c = 0; c < buffsize; c++) {
    if(c == buffsize-1) {
        ss << std::hex << std::showbase << buf[c];
    } else {
        ss << std::hex << std::showbase << buf[c] << ":";
    }
}
const std::string finalstring = ss.str();
QString resultStr(finalstring.c_str());
return resultStr;
}

Upvotes: 0

Views: 2059

Answers (2)

Aaron
Aaron

Reputation: 1191

Another version using a QByteArray and a joined QStringList:

QString getBufferAsHexStr(QByteArray buf) {
   QStringList byteStrings;
   for (int i = 0; i < buf.size(); ++i)
      byteStrings += QString("0x") + QString("%1").arg(buf[i], 2, 16, QChar('0')).toUpper();
   return byteStrings.join(":");
}

It would by called using

QString result = getBufferAsHexStr(QByteArray(charArr, charArrSize));

Upvotes: 0

ixSci
ixSci

Reputation: 13698

I don't know why you started to use C++ functions with C++ types when you have a much better alternative which is QString. Using QString you might implement it as follows:

QString getBufferAsHexStr(const unsigned char* buf, int buffsize) {
    QString result;
    for(int i = 0; i < buffsize; ++i)
        result += "0x" + QString("%1:").arg(buf[i], 2, 16, QChar('0')).toUpper();
    result.chop(1);
    return result;
}

Upvotes: 4

Related Questions