我一直在阅读有关同一主题的许多建议,并尝试实施其中的许多建议,但似乎其中没有一个真正在我的环境中工作。 我正在使用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;
}
答案 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));