在c ++中创建和显示十六进制字符串

时间:2016-05-09 16:06:01

标签: c++ qt

我一直在阅读有关同一主题的许多建议,并尝试实施其中的许多建议,但似乎其中没有一个真正在我的环境中工作。 我正在使用QT 5,但我认为问题与QT无关,而是与语言如何解释十六进制字符0x00。 我必须实现的是将无符号字符串流显示为十六进制值,例如:

  

输入字节:0x00 0x4E 0x01 0x00 0x17 0x00

     

显示为:0x00:0x4E:0x01:0x00:0x17:0x00

看起来很容易,但我得到的只是一个空字符串......

我写的函数:

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

2 个答案:

答案 0 :(得分:4)

当你有一个更好的替代方法QString时,我不知道为什么你开始使用C ++类型的C ++函数。使用QString您可以按如下方式实现它:

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

答案 1 :(得分:0)

使用QByteArray和加入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(":");
}

通过使用

进行调用

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