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

create and display hexadecimal string in c++

本文关键字:显示 十六进制 字符串 创建 c++      更新时间:2023-10-16

我已经阅读了许多关于同一主题的建议,并尝试实现其中的许多建议,但似乎没有一个在我的环境中真正起作用。我使用的是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;
}

我不知道为什么在有更好的替代方案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;
}

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